如果我没有误,使用数据报文必须在模型中。所以,这样的代码
var db=new TestEverybody();//it is class,which was generated by EntityFramework var currentTesting=db.Testing.(t => t.id == id).First();
必须位于模型中,不能在控制器中,不能吗?
但TryUpdateModel的用法的例子如下:
public ActionResult Edit(Testing obj)//Testing collection { var db = new TestEverybody(); var currentTesting=db.Testing.(t => t.id == obj.id).First(); TryUpdateModel(currentTesting); db.SaveChanges(); return RedirectToAction("Index"); }
这不会打破MVC架构吗?我们在控制器中使用数据库,而不是在特殊的Model类中。
那么,什么是在一个真正的项目中使用TryUpdateModel的最好的方法?
解决方法
所以为什么要使用视图特定的模型
>您应该只将信息传递给您需要的视图。
>通常,您需要添加其他视图元数据(如标题/描述属性)。这些不属于您的实体。
>使用TryUpdateModel / UpdateModel是错误的。不要使用(我会解释为什么)。
>很少,你的视图模型将完全匹配你的实体。人们通常最终只是使用ViewBag而不是强类型的视图模型属性来向他们的实体添加额外的碎片(或者更好)。
>如果你使用ORM,你可以遇到延迟加载属性的问题(N 1)。您的视图不应该发出查询。
我们将从一个简单的实体开始:
public class Product { public int Id {get;set;} public string Name {get;set;} public string Description {get;set;} public decimal Price {get;set;} }
让我们假设你有一个简单的表单,用户只能更新产品的名称和描述。但你使用(非常贪婪)TryUpdateModel。
所以我使用任何数量的工具(如Fiddler)自己构造一个POST并发送以下内容:
Name=WhatverIWant&Description=UnluckyFool&Price=0
ASP.NET MVC模型绑定器将检查输入表单集合,看到这些属性存在于您的实体,并自动绑定为您。因此,当您刚刚从数据库中检索的实体上调用“TryUpdateModel”时,所有匹配的属性都将更新(包括Price!)。新选项的时间。
查看特定模型
public class EditProductviewmodel { [HiddenInput] public Guid Id {get;set;} [required] [DisplayName("Product Name")] public string Name {get;set;} [AllowHtml] [DataType(DataType.MultilineText)] public string Description {get;set;} }
这只包含我们需要的属性。注意,我们还添加了一些验证属性,显示属性和一些mvc特定属性。
通过不受我们在我们的视图模型中的限制,它可以使您的视图更清洁。例如,我们可以通过在我们的视图中显示以下内容来呈现整个编辑表单:
@Html.EditorFor(model => model)
Mvc将检查我们添加到视图模型中的所有属性,并自动连接验证,标签和正确的输入字段(即文本区域以供说明)。
发布表单
[HttpPost] public ActionResult EditProduct(EditProductviewmodel model) { var product = repository.GetById(model.Id); if (product == null) { return HttpNotFound(); } // input validation if (ModelState.IsValid) { // map the properties we **actually** want to update product.Name = model.Name; product.Description = model.Description; repository.Save(product); return RedirectToAction("index"); } return View(model) }
从这个代码它是很明显的它做什么。当我们更新实体时,我们没有任何不良影响,因为我们在我们的实体上显式设置属性。
我希望这解释了View-Model模式足以让你使用它。