2010-06-26 197 views
1

我想创建一个自定义模型绑定器来验证有界模型。我发现了几个这样的例子,它的工作原理应该如此。但是,如果模型中存在错误,我还希望能够将用户发回到他来自的页面。自定义模型绑定器

这样做是否可行?是否有任何明显的副作用?

我想要实现的是控制器总是获取有效的命令,所以我不需要检查action.Method中的model.IsValid()。

+0

您可以分享您已阅读的文章,并显示您目前为止的代码吗? – 2010-06-26 08:50:30

+0

达林,我不能分享我的代码atm,但这里有一篇关于它的文章。 http://schotime.net/blog/index.php/2009/05/11/fluent-validation-model-binder-aspnet-mvc/我不使用Fluent验证,但概念是相同的。 – walie 2010-06-28 06:02:24

回答

3

你试图做的看起来不错,但它不会工作。限制太多了。

  1. 通常,只有控制器可以决定在出现错误的情况下重定向到哪里。您可以使用其他属性,如[OnError(“Action”)],但看起来像解决方法。
  2. 表格不发帖全部数据。例如,下拉列表,辅助值必须由控制器填写。你可以使用动作过滤器来实现这一点,但这又一次看起来像是黑客。

您可以设置将检查模型错误(活页夹设置)和重定向(setup.Result)的全局操作过滤器(在基本控制器上)。但是这很复杂,需要太多额外的“代码” - 属性等,这些很难跟踪并与真实的应用程序逻辑相关联。它变得过于严格很快(见漏抽象法),当你需要不出错重定向只是简单的动作名称等

这看起来简单,当这样做:

public ActionResult PostAction(ViewModel data) 
{ 
    if (!ModelState.IsValid) 
     return View("GetAction", data.WithDropDownList(repository.GetProducts())); 

} 

在上面的例子中,控制器可以控制工作流程,就像它应该那样。它也有自由执行额外的验证/设置。你仍然可以使用尽可能多的基础设施 - 模型粘合剂来提供模型状态错误等 - 但只有控制器应该对输入和输出做出最终决定。

+0

你是对的,它的控制者应该处理这些错误,我会坚持我的验证模型构建器并让控制器处理这个动作。 – walie 2010-06-28 06:00:15