如何让C#IErrorDataInfo与ASP.MVC 3一起使用
我已经在我的模型上验证了我的IErrorDataInfo实现的有效性,但是我似乎无法从我的模型上的IErrorDataInfo到控制器中的ASP.MVC ModelState获取验证错误。最好的方法是什么 我可以循环我的结果并手动将它们添加到ModelState,但必须有一种更简单的方法 这是我的客户机控制器如何让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.
[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");
}
}