1

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

这是可能的吗?这样做有什么明显的副作用吗?

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

4

1 回答 1

3

您尝试做的事情看起来不错,但行不通。限制太多了。

  1. 通常,只有控制器才能决定在发生错误时重定向到哪里。您可以使用其他属性,例如 [OnError("Action")] 但这看起来像是解决方法。
  2. 表单不会发布所有数据。例如,下拉列表,辅助值必须由控制器填充。您可能可以为此使用操作过滤器,但这再次看起来像一个黑客。

您可以设置全局操作过滤器(在基本控制器上),它将检查模型错误(绑定器设置)和重定向(设置 .Result)。但这很复杂,需要太多额外的“代码”——属性等,然后很难跟踪并与实际应用程序逻辑相关联。而且它很快就会变得过于严格(参见泄漏抽象法则),当您不仅需要错误重定向上的简单操作名称等时。

这样做看起来简单得多:

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

}

在上面的示例中,控制器应该控制工作流。它还可以自由执行额外的验证/设置。您仍然可以使用尽可能多的基础设施——模型绑定器来提供 ModelState 错误等——但只有控制器才能对输入和输出做出最终决定。

于 2010-06-26T13:48:17.093 回答