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中Button的CommandArgument传递多个参数
- 从ASP.NET连接到远程MongoDB实例
- ASP.NET MVC实现layui富文本编辑器应用
- asp.net – 忽略在IIS中为代码400(错误请求)配置的自定义错
- asp.net-core – 我可以提交MVC6视图组件吗?
- asp.net – User.Identity.GetUserId()方法无法在Web Api 2
- asp.net – Visual Studio 2010图表控件 – 线条颜色
- asp.net-mvc – 使用哪个:“AcceptGet,AcceptPost”(MvcCo
- asp.net – ELMAH是否默认实施并启用了防洪功能?
- asp.net – 在SQL SERVER 2005上启用CLR是否存在安全问题?
- ASP.NET MVC3 Razor – 如何有条件地退出或结束或
- ASP.Net vnext api在localhost上工作,在azure上返
- asp.net-mvc-4 – ASP.NET MVC 4单独项目中的区域
- asp.net – 在什么情况下,.NET进程和AppDomains在
- ASP.NET MVC =具有.NET类库的经典ASP.真?
- 是否可以在.NET中将WinForm转换为WebForm?
- ASP.NET MVC类级自定义数据注释和ModelState键
- asp.net – .Net核心Cookie身份验证在IIS中托管时
- asp.net – Service Fabric中的.NET Core RC2
- asp.net mvc添加到AUTHORIZE属性