asp.net-mvc – 服务层验证
|
我试图在我的应用程序中实现验证策略.我有一个MVC层,服务层,存储库和域POCO.现在在MVC层,我使用我的视图模型上的数据注释来验证用户输入,允许我给用户快速反馈.在控制器中,我调用ModelState.IsValid来检查输入,然后再使用automapper设置域对象. 这里是我的烦恼.我将域对象传递到需要根据我的业务规则进行验证的服务,但是如何将验证错误传递给控制器?我发现的例子做了以下一个: >在服务层中抛出异常并捕获Contoller.但这似乎是错误的,当然例外是例外情况,我们应该返回一些有意义的东西. 有没有一个更简单的方法我失踪了?我已经看到很多关于这个问题,但没有具体的解决办法,而不是上面提到的.我认为在验证中的任何方法可以传回一些我可以在控制器中使用的键/值对象,但不确定此策略是否可能在以后出现问题. 解决方法我认为相当优雅的方式是在您的服务上使用一个有效的方法,从业务逻辑返回模型错误字典.这样,没有将ModelState注入到服务中 – 该服务只是进行验证并返回任何错误.然后由控制器将这些ModelState错误合并到其ViewData中.因此,服务验证方法可能如下所示: public IDictionary<string,string> ValidatePerson(Person person)
{
Dictionary<string,string> errors = new Dictionary<string,string>();
// Do some validation,e.g. check if the person already exists etc etc
// Add model erros e.g.:
errors.Add("Email","This person already exists");
}
然后您可以在控制器中使用扩展方法将这些错误映射到ModelState上,如下所示: public static class ModelStateDictionaryExtensions
{
public static void Merge(this ModelStateDictionary modelState,IDictionary<string,string> dictionary,string prefix)
{
foreach (var item in dictionary)
{
modelState.AddModelError((string.IsNullOrEmpty(prefix) ? "" : (prefix + ".")) + item.Key,item.Value);
}
}
}
然后您的控制器将使用: ModelState.Merge(personService.ValidatePerson(person),""); (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – “发布失败”,但建立成功?
- ASP.NET Core:跟踪当前活动页面,或如何在视图中获取控制器
- 强制ASP.NET为所有用户代理生成JavaScript
- asp.net-mvc-3 – 大量使用ViewBag
- asp.net – 这个LINQ statment是否容易受SQL注入攻击?
- asp.net – 从多个Web.config文件访问appSettings
- asp.net – 小数点后尾数为零
- asp.net-web-api2 – 如何创建HttpRequestHeaders类的实例
- asp.net-mvc-3 – MVC3和认证
- asp.net-core – 从ASP.NET Core MVC Web应用程序(RC2)引用
