如何使用模型项和ASP.net MVC 3中的表单输入进行简单计算?

Thu*_*gwe 6 asp.net asp.net-mvc-3

我是编程和ASP.net MVC 3的新手,所以不要对我对此缺乏了解感到惊讶.好吧,我想要乘以两位小数,一位十进制来自用户填充的形式,另一位十进制来自Model类(从数据库中获取).

我有两个名为RATE&PROJECTMATERIAL的Model类.RATE类有一个名为Amount的项目,表示一个Rate的数量,PROJECTMATERIAL类有一个项目数量.类是相关的,我希望能够说变量1 =数量*Rates.amount并将variable1返回到我的索引,删除,详细信息视图.我不想将variable1存储到我的数据库,但我只想在我的视图中显示.....但我不知道如何以及在哪里做

项目材料类的代码..

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; }

}
Run Code Online (Sandbox Code Playgroud)

范围类的代码..

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; }
}
Run Code Online (Sandbox Code Playgroud)

项目控制器类的代码......

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");
    }
Run Code Online (Sandbox Code Playgroud)

Thanx提前家伙!! 真的需要你的帮助.

Ian*_*dge 7

看到你说你是MVC的新手,我给了你一些选择,并解释哪个最好,为什么,因为现在最好去理解,这样你就不会养成坏习惯,特别是如果你开始建造更大的项目.

您不一定需要创建变量,因为您可以在视图中执行该计算.因为您将域模型直接传递给视图,所以您可以(在剃刀中):

@(Model.Quantity * Model.Rates.Amount)
Run Code Online (Sandbox Code Playgroud)

虽然这是最简单的选择,但我不一定会推荐这个,因为视图应该是愚蠢的 - 请参阅ASP.NET MVC:我的观点应该是多么愚蠢?.

另一种选择是在控制器中进行计算并传递ViewBag中的值,例如:

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

然后你可以在你的视图中使用它:

@ViewBag.Price
Run Code Online (Sandbox Code Playgroud)

再次,这很容易,但我不推荐它,因为ViewBag没有强类型 - 请参阅在MVC中使用ViewBag是不是很糟糕?.

你可以把一个属性放在你的ProjectMaterial班级上,这是一个很好的解决方案.

public decimal Price
{
    get
    {
        return Quantity * Rates.Amount;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果Price是一个只在视图中使用的属性(即您只是显示它),那么它可能不应该在您的域模型中,因为您的域模型就是 - 存储和访问原始数据.

也许最好的方法是创建一个特定于您的视图的视图模型(请参阅http://stephenwalther.com/blog/archive/2009/04/13/asp.net-mvc-tip-50-ndash-create-view-models .aspx)具有Price属性.这意味着该属性仅在需要的地方使用,域模型保持不变,您的视图仍然愚蠢,您的域模型不会暴露给您的视图.请参阅为什么选择两个类,查看模型和域模型?也是对视图模型的一个很好的解释