MVC为什么UpdateModel有时用在Edit中,有时候不用

时间:2011-07-26 22:03:50

标签: asp.net-mvc

我是MVC的新手,我一直在寻找一些例子。

对于某些修改的HttpPost,他们会调用UpdateModel(entity)

在其他例子中:

http://www.asp.net/mvc/tutorials/mvc-music-store-part-5

UpdateModel(entity)根本没有被调用。

当它在MVCMusicStore中显得不必要时调用这个函数有什么意义?

显然它是“使用控制器当前值提供程序中的值更新指定的模型实例。”

但是我从MVCMusicStore示例中发现更新的值已经通过?

发布了

有人可以向我解释一下吗?

3 个答案:

答案 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教程中。