如何让C#IErrorDataInfo与ASP.MVC 3一起使用

如何让C#IErrorDataInfo与ASP.MVC 3一起使用,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我已经在我的模型上验证了我的IErrorDataInfo实现的有效性,但是我似乎无法从我的模型上的IErrorDataInfo到控制器中的ASP.MVC ModelState获取验证错误。最好的方法是什么 我可以循环我的结果并手动将它们添加到ModelState,但必须有一种更简单的方法 这是我的客户机控制器 [HttpPost] public ActionResult Edit(Grade grade) { MvcApplication.Container.

我已经在我的模型上验证了我的IErrorDataInfo实现的有效性,但是我似乎无法从我的模型上的IErrorDataInfo到控制器中的ASP.MVC ModelState获取验证错误。最好的方法是什么

我可以循环我的结果并手动将它们添加到ModelState,但必须有一种更简单的方法

这是我的客户机控制器

  [HttpPost]
    public ActionResult Edit(Grade grade)
    {
        MvcApplication.Container.BuildUp(grade);

        if (!ModelState.IsValid)
        {
            return View("Edit", grade);
        }

        try
        {
            var provider = MvcApplication.Container.Resolve<IGradeProvider>();
            provider.Edit(grade);

            return RedirectToAction("Details", "Grade", new { id = grade.GradeId });
        }
        catch
        {
            return RedirectToAction("Index");
        }
    }
更新:


我应该补充一点,我正在使用依赖注入。问题不在于IErrorDataInfo不能与ASP.MVC 3一起工作,而是IErrorDataInfo需要一个注入的参数才能正常工作。为了解决此问题,我在构建对象后但在调用ModelState.IsValid之前手动调用了TryValidateModel。

DataErrorInfoModelValidatorProvider正在使用IDataErrorInfo的项成员收集属性级验证错误,并使用Error属性收集模型级验证错误:

public string Error
{
  //This is needed for model level validation to work
  get { throw new NotImplementedException(); }
}

public string this[string propertyName]
{
  //This is needed for property level validation to work
  get { throw new NotImplementedException(); }
}
如果您没有禁用DataErrorInfoModelValidatorProvider,那么在正确实现时,这一切都应该是开箱即用的

更新:

如果您的模型在模型绑定过程中未准备好进行验证(或者您不希望它被ASP.NET MVC绑定),则需要在调用ModelState.IsValid方法之前手动验证模型。您的控制器可能如下所示:

[HttpPost]
public ActionResult Edit(Grade grade)
{
  MvcApplication.Container.BuildUp(grade);

  //Add this to your controller.
  TryValidateModel(grade);

  if (!ModelState.IsValid)
  {
    return View("Edit", grade);
  }

  try
  {
    var provider = MvcApplication.Container.Resolve<IGradeProvider>();
    provider.Edit(grade);

    return RedirectToAction("Details", "Grade", new { id = grade.GradeId });
  }
  catch
  {
    return RedirectToAction("Index");
  }
}
[HttpPost]
公共行动结果编辑(等级)
{
MVC应用。容器。堆积物(等级);
//将其添加到控制器中。
TRYVALIDATE模型(等级);
如果(!ModelState.IsValid)
{
返回视图(“编辑”,等级);
}
尝试
{
var provider=mvcapapplication.Container.Resolve();
提供者。编辑(等级);
返回重定向到操作(“详细信息”、“等级”,新的{id=Grade.GradeId});
}
抓住
{
返回操作(“索引”);
}
}

我觉得应该开箱即用。让我检查一下提供程序。请共享Grade类实现。我验证了IErrorDataInfo的Grade类毕竟是由mvc调用的。看起来我问错问题了。我在我的模型中使用依赖项注入,看起来在ASP.MVC 3调用this[string propertyName]方法时没有建立等级模型。我想真正的问题是我需要在控制器调用方法之前注入依赖项。Hmmm.@Keith要进行验证,您的成绩参数根本无法注入,它必须由ASP.NET MVC根据请求构建(验证发生在ModelBinder通过ValueProvider获取值并构建模型时)@Keith作为替代方法,您可以使用Controller.ValidateModel()在操作中手动触发验证
[HttpPost]
public ActionResult Edit(Grade grade)
{
  MvcApplication.Container.BuildUp(grade);

  //Add this to your controller.
  TryValidateModel(grade);

  if (!ModelState.IsValid)
  {
    return View("Edit", grade);
  }

  try
  {
    var provider = MvcApplication.Container.Resolve<IGradeProvider>();
    provider.Edit(grade);

    return RedirectToAction("Details", "Grade", new { id = grade.GradeId });
  }
  catch
  {
    return RedirectToAction("Index");
  }
}