我想创建一个自定义模型绑定器来验证有界模型。我已经找到了几个这样的例子,它应该可以正常工作。但如果模型中有错误,我也希望能够将用户发送回他来自的页面。
这是可能的吗?这样做有什么明显的副作用吗?
我想要实现的是控制器总是得到有效的命令,所以我不需要在 action 方法中检查 model.IsValid() 。
我想创建一个自定义模型绑定器来验证有界模型。我已经找到了几个这样的例子,它应该可以正常工作。但如果模型中有错误,我也希望能够将用户发送回他来自的页面。
这是可能的吗?这样做有什么明显的副作用吗?
我想要实现的是控制器总是得到有效的命令,所以我不需要在 action 方法中检查 model.IsValid() 。
您尝试做的事情看起来不错,但行不通。限制太多了。
您可以设置全局操作过滤器(在基本控制器上),它将检查模型错误(绑定器设置)和重定向(设置 .Result)。但这很复杂,需要太多额外的“代码”——属性等,然后很难跟踪并与实际应用程序逻辑相关联。而且它很快就会变得过于严格(参见泄漏抽象法则),当您不仅需要错误重定向上的简单操作名称等时。
这样做看起来要简单得多:
public ActionResult PostAction(ViewModel data)
{
if (!ModelState.IsValid)
return View("GetAction", data.WithDropDownList(repository.GetProducts()));
}
在上面的示例中,控制器应该控制工作流。它还可以自由执行额外的验证/设置。您仍然可以使用尽可能多的基础设施——模型绑定器来提供 ModelState 错误等——但只有控制器才能对输入和输出做出最终决定。