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.
任何见解?
更新: 我回答了我自己的问题,但是如果有人有更好的答案,我不会将其标记为几天的答案.
好吧,经过一番思考后,我发现了本来应该显而易见的事情:将模型作为参数传递只会导致默认模型绑定器在幕后使用。既然这是我不使用强类型版本的最大原因,那么我想现在没有理由不使用。
另外,我的代码应该如下所示:
[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)
| 归档时间: |
|
| 查看次数: |
2718 次 |
| 最近记录: |