Asp.net mvc NerdDinner和#x27;AddModelErrors是否有效?

Asp.net mvc NerdDinner和#x27;AddModelErrors是否有效?,asp.net-mvc,extension-methods,nerddinner,Asp.net Mvc,Extension Methods,Nerddinner,我正在学习免费晚餐教程 我在第5步的某个地方提到,为了让代码更干净,我们可以创建一个扩展方法。我看了一下完整的代码,它使用了以下扩展方法: catch { ModelState.AddModelErrors(dinner.GetRuleViolations()); return View(new DinnerFormViewModel(dinner)); } 然后将其作为扩展方法的定义 namespace NerdDinner.Helpers { public st

我正在学习免费晚餐教程

我在第5步的某个地方提到,为了让代码更干净,我们可以创建一个扩展方法。我看了一下完整的代码,它使用了以下扩展方法:

catch
{
    ModelState.AddModelErrors(dinner.GetRuleViolations());
    return View(new DinnerFormViewModel(dinner));
}
然后将其作为扩展方法的定义

namespace NerdDinner.Helpers {

    public static class ModelStateHelpers {

        public static void AddModelErrors(this ModelStateDictionary modelState, IEnumerable<RuleViolation> errors) {

            foreach (RuleViolation issue in errors) {
                modelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
            }
        }
    }
}
namespace NerdDinner.Helpers{
公共静态类ModelStateHelpers{
公共静态void AddModelErrors(此ModelStateDictionary modelState,IEnumerable错误){
foreach(错误中的规则违反问题){
AddModelError(issue.PropertyName,issue.ErrorMessage);
}
}
}
}
我尝试按照教程所说的结合代码所包含的内容进行操作,但收到预期的错误,即没有只接受1个参数的
AddModelErrors
方法


我显然错过了一些非常重要的事情。它是什么?

您需要包括助手参考

using NerdDinner.Helpers;

然后检查是否有效并添加错误

if (!dinner.IsValid)
{
    ModelState.AddModelErrors(dinner.GetRuleViolations());
    return View(dinner);
}
你还必须为你的晚餐上部分课程

public partial class Dinner
{
    public bool IsValid
    {
        get { return (GetRuleViolations().Count() == 0); }
    }

    public IEnumerable<RuleViolation> GetRuleViolations()
    {
        if (String.IsNullOrEmpty( SomeField ))
            yield return new RuleViolation("Field value text is required", "SomeField");
    }

    partial void OnValidate(ChangeAction action)
    {
        if (!IsValid)
            throw new ApplicationException("Rule violations prevent saving");
    }
}

如果您收到与此海报相同的错误消息:

“'System.Web.Mvc.ModelStateDictionary'不包含'AddModelErrors'的定义,并且找不到接受'System.Web.Mvc.ModelStateDictionary'类型的第一个参数的扩展方法'AddModelErrors'(是否缺少using指令或程序集引用?)

您可能遇到以下问题:


我没有使用NerdDinner.Helpers;然而,我不明白为什么没有这一点会使它不起作用。我肯定缺少了一些关于C#如何工作的基本知识……是的,我完全不理解什么是扩展方法。这个URL为我清除了它:谢谢你的帮助!您需要包含对命名空间的引用,否则.Net将不知道您的助手类在哪里。扩展方法只是一个静态方法,具有更易于阅读的语法。这就是为什么需要为定义扩展方法的命名空间添加using指令。ModelState.AddModelErrors(dinner.GetRuleViolations());与ModelStateHelpers.AddModelErrors(ModelState,dinner.GetRuleViolations())相同;谢谢你,本。我现在知道了。我尝试了一些类似ModelStateHelpers.AddModelErrors(晚餐.GetRuleViolations());这显然不适用于一个参数。我不知道如何用一个参数调用它。。。但现在我明白为什么了。相当整洁!非常感谢。这不是这里的问题,但很好地指出示例中存在一些错误。我的问题是,我只是不明白什么是扩展方法……请确保在您包含的ControllerHelper类中:使用System.Web.Mvc;未使用System.Web.Http.ModelBinding;我正是因为这个才有问题的。
public partial class Dinner
{
    public bool IsValid
    {
        get { return (GetRuleViolations().Count() == 0); }
    }

    public IEnumerable<RuleViolation> GetRuleViolations()
    {
        if (String.IsNullOrEmpty( SomeField ))
            yield return new RuleViolation("Field value text is required", "SomeField");
    }

    partial void OnValidate(ChangeAction action)
    {
        if (!IsValid)
            throw new ApplicationException("Rule violations prevent saving");
    }
}
public class RuleViolation
{
    public string ErrorMessage { get; private set; }
    public string PropertyName { get; private set; }

    public RuleViolation(string errorMessage)
    {
        ErrorMessage = errorMessage;
    }

    public RuleViolation(string errorMessage, string propertyName)
    {
        ErrorMessage = errorMessage;
        PropertyName = propertyName;
    }
}