Asp.net mvc NerdDinner和#x27;AddModelErrors是否有效?
我正在学习免费晚餐教程 我在第5步的某个地方提到,为了让代码更干净,我们可以创建一个扩展方法。我看了一下完整的代码,它使用了以下扩展方法: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
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;
}
}