ASP.NET MVC:ModelState与ModelStateDictionary

时间:2009-08-18 05:06:29

标签: c# asp.net asp.net-mvc

我有一个服务,它有一个在触发某个控制器方法时调用的方法。

我的服务返回一个自定义结果对象 PlacementResult ,我想在其中将可能发生的错误(验证)传回控制器方法。

PlacementResult 是否应该使用ModelState或ModelStateDictionary将错误传回控制器(最后查看)?我怎么把它串起来?

最后,如何将ModelState / ModelStateDictionary(无论你告诉我应该选择哪个)返回到视图中(突出显示相应的文本框,显示错误消息等)?

谢谢!

6 个答案:

答案 0 :(得分:3)

这是一个很好的链接,显示服务如何执行验证并将结果传回控制器:

http://www.asp.net/mvc/tutorials/validating-with-a-service-layer-cs(固定链接)

答案 1 :(得分:2)

不,您不希望将ModelStateDictionary添加到结果类型中。 Controller上已有一个ModelStateDictionary(在ModelState属性中)。设置控制器的模型状态不适合结果。这应该在绑定期间或在控制器操作本身内完成。如果需要,请使用自定义模型绑定器。

您选择的人可以通过检查控制器的ViewData.ModelState属性来查看模型状态错误。

答案 2 :(得分:1)

你的PlacementResult应该返回一个字典对象或一个List,你应该在每个动作开始时与模型状态合并。

如果您单步执行,您会注意到控制器模型状态字典包含所有输入字段,它们的值以及与它们相关的错误。您希望将PlacementResult错误合并到适当键的模型状态字典中。这是视图引擎知道哪些字段标记为无效的方式。

ModelState.Merge(PlacementResult);
if(ModelState.IsValid)
{
    ...
}

答案 3 :(得分:0)

我不知道您的PlacementResult是什么样子,看看您是否可以在视图中使用它:

ModelState.AddModelError(ErroredProperty, ErrorMessage);

确保将失败的对象返回到视图

return View(myObjectInstance);

答案 4 :(得分:0)

基于SoC,我认为您必须从服务中返回错误,并在需要时将它们合并到您的ModelState中。

但我们的目标是维持解耦并使用ModelState.Merge()方法。不是吗?

concrete implementation可以提供帮助

答案 5 :(得分:0)

您可以将Controller传递给您的方法,因为Controller类包含ModelState属性。进入方法后,您可以执行以下操作:

private PlacementResult BuildResult(Controller controller)
{
   controller.ModelState.AddModelError(propertyName, errorMessage);
}

在你的行动......

BuildResult(this);
if(ModelState.IsValid) {...