我有一个服务,它有一个在触发某个控制器方法时调用的方法。
我的服务返回一个自定义结果对象 PlacementResult ,我想在其中将可能发生的错误(验证)传回控制器方法。
PlacementResult 是否应该使用ModelState或ModelStateDictionary将错误传回控制器(最后查看)?我怎么把它串起来?
最后,如何将ModelState / ModelStateDictionary(无论你告诉我应该选择哪个)返回到视图中(突出显示相应的文本框,显示错误消息等)?
谢谢!
答案 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) {...