In the NerdDinner tutorial, Step 5,在完整编辑操作方法实施下的中间有一段:
我们的Edit实现的好处是我们的Controller类和我们的View模板都不需要知道关于我们的Dinner模型强制执行的特定验证或业务规则的任何信息。我们可以在将来为我们的模型添加其他规则,并且不必对我们的控制器或视图进行任何代码更改,以便支持它们。这为我们提供了灵活性,可以在将来轻松改进我们的应用程序需求,而且代码更改最少。
我的问题是可以添加什么样的规则,这样我就不会失去清洁的分离。我可以看到这段代码:
public static class ControllerHelpers {
public static void AddRuleViolations(this ModelStateDictionary modelState, IEnumerable<RuleViolation> errors) {
foreach (RuleViolation issue in errors) {
modelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
}
}
比这段代码更好:
catch {
foreach (var issue in dinner.GetRuleViolations()) {
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return View(dinner);
}
因为我没有特定的类/模型信息,可以在整个应用程序中使用它。并且,如果我的错误处理像上面那样简单,我可以看到这是多么好,但我不知道如何为新的业务规则添加更复杂的东西,并且希望有一个例子。
答案 0 :(得分:0)
首先要了解您发布的代码实际上只是从模型中“拉出”错误并将它们放在View上(通过ModelState)。灵活性来自于任何新的规则/编辑只需触及模型。即你只需要点击Dinner.cs代码即可。
我必须在NerdDinner课程中学习的一件事是,在Dinner.cs OnValidate()部分方法和DinnersController.cs中调用UpdateModel()时都会进行验证。此调用将文本从屏幕复制到模型中。例如,如果它尝试将文本复制到浮点数,它将更新ModelState并抛出错误。正常验证不会运行。