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