代码之家  ›  专栏  ›  技术社区  ›  johnny

呆子晚餐验证规则问题

  •  0
  • johnny  · 技术社区  · 15 年前

    In the NerdDinner tutorial, Step 5 ,下半部 完成编辑操作方法实现 有一段:

    我们的编辑实现的好处是,无论是控制器类还是视图模板,都不必知道晚餐模型所实施的特定验证或业务规则。我们可以在将来向模型中添加额外的规则,而不必对控制器或视图进行任何代码更改,以支持它们。这为我们提供了灵活性,以便在将来以最少的代码更改轻松地发展我们的应用程序需求。

    我的问题是什么样的规则可以加入,这样我就不会失去我的干净分离。我可以看到这个代码:

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

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

    1 回复  |  直到 15 年前
        1
  •  0
  •   Ken H    15 年前

    首先要明白,您发布的代码实际上只是从模型中“提取”错误并将它们放在视图中(通过ModelState)。灵活性来自于这样一个事实:任何新的规则/编辑都只需要接触模型。i、 你只要打晚餐.cs代码。

    我不得不在书呆子的教训中摸索出一件事,那就是验证将发生在晚餐.csOnValidate()分部方法和晚餐控制器.cs在对UpdateModel()的调用中。此调用将文本从屏幕复制到模型中。例如,如果它试图将文本复制到float,它将更新ModelState并抛出一个错误。正常验证将不运行。