2012-01-19 3 views
5

Я новичок в программировании и ASP.net MVC 3, поэтому не удивляйтесь моей нехватке знаний об этом. Хорошо, я хочу умножить два десятичных знака. Одно десятичное число происходит из формы, которую пользователь заполняет, а другой десятичной происходит из класса Model (получает его из базы данных).Как сделать простые вычисления с использованием элементов модели и ввода из формы в ASP.net MVC 3?

У меня есть два класса модели, называемые RATE & PROJECTMATERIAL. Класс RATE имеет элемент под названием Сумма, в котором указывается размер ставки, а класс PROJECTMATERIAL имеет номер количество. Классы связаны, и я хочу иметь возможность сказать variable1 = количество * Rates.amount и вернуть переменную1 в мои индексы, Удалить, Детали. Я не хочу хранить переменную1 в моей базе данных, но я просто хочу отображать в своих представлениях ..... но я не знаю, как и где это сделать.

Код из класса материалов проекта ..

public class ProjectMaterial 
{ 
    public int ProjectMaterialID { get; set; } 

    [Required] 
    [Display(Name = "Scope Name")] 
    public int? ScopeID { get; set; } 

    [Required] 
    [Display(Name = "Rate Code")] 
    public int? RateID { get; set; } 

    [Required] 
    [Display(Name = "Quantity")] 
    public decimal Quantity { get; set; } 


    public virtual Scope Scopes { get; set; } 
    public virtual Rate Rates { get; set; } 

} 

код из области видимости класса ..

public class Rate 
{ 
    public int RateID { get; set; } 


    [Required] 
    [Display(Name = "Rate Code")] 
    public int RateCode { get; set; } 

    [Required] 
    [Display(Name = "Unit")] 
    public string Unit { get; set; } 

    [Required] 
    [Display(Name = "Description")] 
    public string Description { get; set; } 

    [Required] 
    [Display(Name = "Amount")] 
    public decimal Amount { get; set; } 

    public virtual ICollection<ProjectMaterial> ProjectMaterials { get; set; } 
} 

код из класса контроллера проекта ...

public class ProjectMaterialController : Controller 
{ 
    private ContructorContext db = new ContructorContext(); 

    // 
    // GET: /ProjectMaterial/ 

    public ViewResult Index() 
    { 
     var projectmaterials = db.ProjectMaterials.Include(p => p.Scopes).Include(p => p.Rates); 

     return View(projectmaterials.ToList()); 
    } 



    // 
    // GET: /ProjectMaterial/Details/5 

    public ViewResult Details(int id) 
    { 
     ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id); 
     return View(projectmaterial); 
    } 

    // 
    // GET: /ProjectMaterial/Create 

    public ActionResult Create() 
    { 
     ViewBag.ScopeID = new SelectList(db.Scopes, "ScopeID", "ScopeName"); 
     ViewBag.RateID = new SelectList(db.Rates, "RateID", "Unit"); 
     return View(); 
    } 

    // 
    // POST: /ProjectMaterial/Create 

    [HttpPost] 
    public ActionResult Create(ProjectMaterial projectmaterial) 
    { 
     if (ModelState.IsValid) 
     { 
      db.ProjectMaterials.Add(projectmaterial); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.ScopeID = new SelectList(db.Scopes, "ScopeID", "ScopeName", projectmaterial.ScopeID); 
     ViewBag.RateID = new SelectList(db.Rates, "RateID", "Unit", projectmaterial.RateID); 
     return View(projectmaterial); 
    } 

    // 
    // GET: /ProjectMaterial/Edit/5 

    public ActionResult Edit(int id) 
    { 
     ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id); 
     ViewBag.ScopeID = new SelectList(db.Scopes, "ScopeID", "ScopeName", projectmaterial.ScopeID); 
     ViewBag.RateID = new SelectList(db.Rates, "RateID", "Unit", projectmaterial.RateID); 
     return View(projectmaterial); 
    } 

    // 
    // POST: /ProjectMaterial/Edit/5 

    [HttpPost] 
    public ActionResult Edit(ProjectMaterial projectmaterial) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(projectmaterial).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.ScopeID = new SelectList(db.Scopes, "ScopeID", "ScopeName", projectmaterial.ScopeID); 
     ViewBag.RateID = new SelectList(db.Rates, "RateID", "Unit", projectmaterial.RateID); 
     return View(projectmaterial); 
    } 

    // 
    // GET: /ProjectMaterial/Delete/5 

    public ActionResult Delete(int id) 
    { 
     ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id); 
     return View(projectmaterial); 
    } 

    // 
    // POST: /ProjectMaterial/Delete/5 

    [HttpPost, ActionName("Delete")] 
    public ActionResult DeleteConfirmed(int id) 
    {    
     ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id); 
     db.ProjectMaterials.Remove(projectmaterial); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

Thanx в ADVA nce ребята !! действительно нужна ваша помощь.

+1

Непонятно, что вы пытаетесь сделать. Вы пытаетесь вычислить итоговые значения в контроллере и передать его обратно в представление? Или вы пытаетесь вычислить общее количество в контроллере и предоставить его доступным для ВСЕХ других видов? – Sean

+0

Thanx, я хочу рассчитать и передать результат ко всем другим представлениям (Index, details & Delete), кроме представления редактирования, потому что общее количество будет рассчитанным значением. –

ответ

6

Видя, как вы говорите, вы новичок в MVC, я дал вам несколько вариантов, и объяснил, что лучше и почему, потому что лучше понять сейчас, чтобы вы не попасть в плохие привычки , особенно если вы начинаете строить более крупные проекты.

Вам необязательно создавать переменную, потому что вы можете сделать это вычисление в своем представлении. Потому что вы передаете модель предметной области непосредственно в окне вы можете сделать (в бритве):

@(Model.Quantity * Model.Rates.Amount) 

Хотя это самый простой вариант, я бы не обязательно рекомендую это как мнения должны быть немым - см ASP.NET MVC: How dumb should my view be?.

Другой вариант сделать расчет в контроллере и передать значение в ViewBag, например:

public ViewResult Details(int id) 
{ 
    ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id); 
    ViewBag.Price = projectmaterial.Quantity * projectmaterial.Rates.Amountl 
    return View(projectmaterial); 
} 

Тогда вы могли бы использовать его на ваш взгляд, как:

@ViewBag.Price 

Опять же, это легко, но я бы не рекомендовал его, так как ViewBag не сильно типизирован - см. Is using ViewBag in MVC bad?.

Вы можете поместить недвижимость на свой класс ProjectMaterial как, что является опрятным решением.

public decimal Price 
{ 
    get 
    { 
     return Quantity * Rates.Amount; 
    } 
} 

Однако, если Price этого свойства, только когда-либо использовал в своих взглядах (то есть вы просто показать его), то это, вероятно, не должно быть в вашей модели предметной области, в качестве модели предметной области только что - хранение и доступ к необработанным данным.

Возможно, наилучшим способом является создание модели просмотра, характерной для вашего вида (см. http://stephenwalther.com/blog/archive/2009/04/13/asp.net-mvc-tip-50-ndash-create-view-models.aspx) с ценовым уровнем. Это означает, что свойство используется только там, где это необходимо, модель домена остается именно такой, ваше представление остается немым, и ваша модель домена не подвергается действию вашего представления. См. Также Why Two Classes, View Model and Domain Model? также для хорошего объяснения модели просмотра.

+0

Спасибо большое! я хотел лучший способ сделать это, и теперь читаю ваши ссылки, я попробовал тот, где я поместил свойство в классе ProjectMaterial раньше (вчера), и это не сработало для меня, каждый раз я создаю новый проект Я получаю исключение Null-Reference, потому что Rates.Amount был ** NULL **, я понял, что это была логическая ошибка, потому что я знал, что это не так, потому что таблица тарифов была заполнена. Снова Thanx много !! –

1

Вы можете добавить свойство к вашей ProjectMaterial модели:

public decimal Price 
{ 
    get 
    { 
     return Quantity * Rates.Amount; 
    } 
} 
+0

Я пробовал это раньше, и похоже, что он собирался потому что все представления Project Material выглядели отлично **, но каждый раз, когда я создавал ** новый ProjectMaterial **, я получил ошибку исключения Null-reference. он жаловался, что Rates.Amount был null, который не был прав, потому что я заполнил таблицу тарифов –

0

Вы могли бы хотеть иметь модельную функцию с экземплярами вашего self.rate и self.material предметы передаются из ваших взглядов. Или иначе вы можете индивидуально рассчитать значения умножения в каждом представлении.

В любом случае вы должны иметь возможность хранить копию по значению умножения (variable1) в сумке представления и передавать его на каждый вид без необходимости сохранять его в БД.

ViewBag.variable1 = rate*material 
return View() 
Смежные вопросы