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

时间:2012-01-19 08:58:29

标签: asp.net asp.net-mvc-3

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

我有两个名为RATE&的模型类。 PROJECTMATERIAL。 RATE类有一个名为金额的项目,用于表示费率金额,PROJECTMATERIAL类具有项目数量。这些类是相关的,我希望能够说 variable1 = quantity * 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; }

}

范围类的代码..

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提前玩家!!真的需要你的帮助。

5 个答案:

答案 0 :(得分:7)

看到你说你是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是一个仅在您的视图中使用的属性(即您只是显示它),那么它可能不应该在您的域模型中,因为您的域模型就是这样 - 存储并访问原始数据。

也许最好的方法是使用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?

答案 1 :(得分:2)

您可以为ProjectMaterial模型添加属性:

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

答案 2 :(得分:0)

您可能希望拥有一个包含self.rate实例的模型函数,以及从您的视图传递的self.material项。或者,您可以单独计算每个视图中的乘法值。

无论哪种方式,您都应该能够将副本存储在视图包中的乘法值(variable1)中,并将其传递到每个视图,而无需将其保存在数据库中。

ViewBag.variable1 = rate*material
return View()

答案 3 :(得分:0)

@(int.Parse(variable) * your value) 

答案 4 :(得分:0)

除了可以在模型类中使用Data Format String和在 View 中使用Html Helper的所有答案之外,还可以保持显示结果中数字的格式通过修改 Controller 中的返回属性来进行类型设置。

在模型类中应用格式设置,在控制器中进行值转换并保持视图标准的目的是实现关注点分离(SoC),以便于维护和控制代码。

考虑以下示例:

产品类属性

[Display(Name = "Max Disc %")]
[DisplayFormat(DataFormatString = "{0:P1}", ApplyFormatInEditMode = true)]
public decimal MaxDiscountRate { get; set; }

产品控制器

        [HttpGet]
        public ActionResult Details(int id)
        {
            if (id == 0)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Products products = _uow.Products.GetById(id);
            if (products == null)
            {
                return HttpNotFound();
            }
            else
            {
                products.MaxDiscountRate /= 100;
            }

            return View(products);
        }

产品详细信息视图

<div class="detail">
   <h5 class="text-teal">@Html.DisplayNameFor(model => model.MaxDiscountRate)</h5>
   <span class="text-peru">@Html.DisplayFor(model => model.MaxDiscountRate)</span>
</div>