我是编程和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提前玩家!!真的需要你的帮助。
答案 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>