哪个更正确:使用UpdateModel()或接收模型作为参数?

Sai*_*udo 7 validation asp.net-mvc

我在文章,书籍和例子中看到了很多创建动作的例子.似乎有两种流行的风格.

 [AcceptVerbs(HttpVerbs.Post)]
 public ActionResult Create(FormCollection collection)
 {
     try
     {
         var contact = Contact.Create();
         UpdateModel<Contact>(contact);
         contact.Save();
         return RedirectToAction("Index");
     }
     catch (InvalidOperationException ex)
     {
         return View();
     }
 }
Run Code Online (Sandbox Code Playgroud)

和...

 [AcceptVerbs(HttpVerbs.Post)]
 public ActionResult Create([Bind(Exclude="Id")]Contact contact)
 {
     try
     {
         contact.Save();  // ... assumes model does validation
         return RedirectToAction("Index");
     }
     catch (Exception ex)
     {
         // ... have to handle model exceptions and populate ModelState errors
         // ... either here or in the model's validation
         return View();
     }
 }
Run Code Online (Sandbox Code Playgroud)

我已经尝试了两种方法,两者都有优点和缺点,IMO.

例如,当使用FormCollection版本时,我必须在我的模型绑定器中手动处理"Id",因为绑定/排除在此处不起作用.使用方法的类型化版本,我根本不能使用模型绑定器.我喜欢使用模型绑定器,因为它允许我填充ModelState错误,而不需要在模型的验证代码中知道ModelState.

任何见解?

更新: 我回答了我自己的问题,但是如果有人有更好的答案,我不会将其标记为几天的答案.

Sai*_*udo 2

好吧,经过一番思考后,我发现了本来应该显而易见的事情:将模型作为参数传递只会导致默认模型绑定器在幕后使用。既然这是我不使用强类型版本的最大原因,那么我想现在没有理由不使用。

另外,我的代码应该如下所示:

 [AcceptVerbs(HttpVerbs.Post)]
 public ActionResult Create([Bind(Exclude="Id")]Contact contact)
 {
     if(!ModelState.IsValid)
         return View();

     contact.Save();
     return RedirectToAction("Index");
 }
Run Code Online (Sandbox Code Playgroud)