Which is more correct: using UpdateModel() or receiving a model as a parameter?
asp.net-mvc, validation
Solution
Well, after some dinking around I discovered what should have been obvious: passing the model as the parameter merely causes the default model binder to get used behind the scenes. Since this was my biggest reason not to use the strongly-typed version, then I guess there is no reason not to now.
Also, my code should look like this:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="Id")]Contact contact)
{
if(!ModelState.IsValid)
return View();
contact.Save();
return RedirectToAction("Index");
}
Problem
I've seen numerous examples of create actions in articles, books, and examples. It seem there are two prevalent styles. ``` [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(); } } ``` And... ``` [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(); } } ``` I've tried both methods and both have pluses and minuses, IMO. For example, when using the FormCollection version I have to deal with the "Id" manually in my model binder as the Bind/Exclude doesn't work here. With the typed version of the method I don't get to use the model binder at all. I like using the model binder as it lets me populate the ModelState errors without having any knowledge of the ModelState in my model's validation code. Any insights? Update: I answered my own question, but I wont mark it as answered for a few days in case somebody has a better answer.