0

在 NerdDinner 教程的 Step 5中,在Complete Edit Action Method Implementations下的中间有一段:

我们的 Edit 实现的好处是,我们的 Controller 类和 View 模板都不需要知道关于晚餐模型强制执行的特定验证或业务规则的任何信息。我们可以在未来向我们的模型添加额外的规则,并且不必为了支持它们而对我们的控制器或视图进行任何代码更改。这使我们能够灵活地在未来通过最少的代码更改轻松地发展我们的应用程序需求。

我的问题是可以添加什么样的规则,并且以这样一种方式,我不会失去我的干净分离。我可以看到这段代码:

 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);
}

因为我没有特定的类/模型信息并且可以在整个应用程序中使用它。而且,如果我的错误处理像上面这样简单,我可以看到这有多好,但是我看不到如何为新的业务规则添加更复杂的东西,并希望有一个例子。

4

1 回答 1

0

首先要了解您发布的代码实际上只是从模型中“提取”错误并将它们放置在视图上(通过模型状态)。灵活性来自于任何新规则/编辑只需要触及模型的事实。即你只需要点击Dinner.cs 代码。

我在 NerdDinner 课程中必须了解的一件事是,验证将在 Dinner.cs OnValidate() 部分方法和对 UpdateModel() 的调用中的 DinnersController.cs 中发生。此调用将文本从屏幕复制到模型中。例如,如果它试图将文本复制到浮点数,它将更新 ModelState 并抛出错误。正常验证不会运行。

于 2009-10-23T15:40:41.733 回答