自定义模型

时间:2010-06-26 08:44:53

标签: asp.net-mvc custom-model-binder

我想创建一个自定义模型绑定器来验证有界模型。我已经找到了几个这样的例子,它可以正常工作。但是,如果模型中存在错误,我还希望能够将用户发送回他来自的页面。

这可能吗,这样做会有明显的副作用吗?

我想要实现的是控制器总是获得有效命令,因此我不需要在action方法中检查model.IsValid()。

1 个答案:

答案 0 :(得分:3)

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

  1. 通常,只有控制器可以决定在发生错误时重定向的位置。您可以使用其他属性,如[OnError(“Action”)],但这看起来像解决方法。
  2. 表格不会发布所有数据。例如,下拉列表,辅助值必须由控制器填充。你可以使用动作过滤器,但这又是一个黑客。
  3. 您可以设置全局操作过滤器(在基本控制器上),以检查模型错误(该活页夹集)和重定向(设置.Result)。但这是错综复杂的,需要太多额外的“代码” - 属性等,然后很难跟踪并与真实的应用程序逻辑相关。并且它很快就会变得过于严格(参见泄漏抽象法则),当你不需要在错误重定向上使用简单的动作名称等时。

    这样看起来很多更简单:

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

    在上面的示例中,控制器可以控制工作流程,就像它应该的那样。它还可以自由执行其他验证/设置。您仍然可以使用尽可能多的基础架构 - 模型绑定器以提供ModelState错误等 - 但只有控制器应该对输入和输出做出最终决定。