我是MVC的新手,我一直在寻找一些例子。
对于某些修改的HttpPost
,他们会调用UpdateModel(entity)
。
在其他例子中:
http://www.asp.net/mvc/tutorials/mvc-music-store-part-5
UpdateModel(entity)
根本没有被调用。
当它在MVCMusicStore中显得不必要时调用这个函数有什么意义?
显然它是“使用控制器当前值提供程序中的值更新指定的模型实例。”
但是我从MVCMusicStore示例中发现更新的值已经通过?
发布了有人可以向我解释一下吗?
答案 0 :(得分:1)
您应该没有理由在较新版本的ASP.NET MVC中使用UpdateModel
最初提供它是因为当您将数据发布回控制器上的操作时,FormsCollection将传递给操作,然后需要调用UpdateModel(entity)
。
然而,在较新版本的ASP.NET MVC中,引入了ModelBinding的概念,允许您的操作定义要传递给操作方法的.net对象,并且模型绑定器将处理将值“绑定”到模型中。
说实话,我不确定他们为什么不弃用UpdateModel()
方法,因为AFAIK完全是多余的。
答案 1 :(得分:1)
将UpdateModel
用于PATCH
语义。来自RFC5789:
PATCH方法请求中描述的一组更改 请求实体应用于由标识的资源 Request-URI中。
这意味着您正在修改现有资源(例如,从数据库中)。
将{em>对象用作PUT
语义的操作方法参数。
PUT和PATCH请求之间的区别反映在 服务器处理封闭实体以修改资源的方式 由Request-URI标识。在PUT请求中,包含的实体 被认为是存储在该资源上的资源的修改版本 原始服务器,客户端请求存储的版本 替换。
实际上,如果请求包含所有资源成员的值,则没有太大区别。但是,如果请求仅包含资源成员子集的值,则在PATCH
中,其他成员保持不变,并且PUT
中的成员将设置为其默认值(通常为NULL)。
答案 2 :(得分:0)
我不认为ModelBinding只是在最新版本的asp.net mvc中引入(最新版本是3)。据我所知,它至少存在于v-2中。当你调用updatemodel时,你明确地调用Modelbinding。当你收到as作为动作方法参数时,会隐式调用Modelbinder 在编辑方案中,当我们从db获取原始实体并告诉控制器使用UpdateModel更新它时使用updateModel
public ActionResult Edit(int id)
{
var entity = db.GetEntity(id);
UpdateModel(entity);
db.SaveChanges();
}
其他情况是当你没有获取db实体但是ModelBinder给你一个从表单字段等创建的实体时你告诉你db已经存在并且它已经在db之外修改了你最好与它同步在MusicStore教程中。