asp.net-mvc – 如何处理ASP.Net MVC中的Model和ViewModel验证
我有一个包含Model和ViewModel的ASP.Net MVC应用程序,这个应用程序有UI和API接口,可以通过不同的控制器工作,UI与ViewModel一起工作,API与Model一起工作. ViewModel对数据注释(C#属性)进行了验证,而Model现在没有验证API现在允许将任何不一致的模型保存到DB.
我现在拥有的: // Model public class Contact { public string Email { get; set; } ... } // ViewModel public class CreateContactViewModel { [Required(ErrorMessage = "*")] [EmailAddress(ErrorMessageResourceType = typeof(CreateContact),ErrorMessageResourceName = "Validation_invalid_email",ErrorMessage = null)] public string Email { get; set; } ... } // View ... <div style="padding-bottom:13px;"> @Html.TextBoxFor(x => x.Email,new { style = "width:405px;" }) @Html.ValidationMessage("Email",new { style = "color:red;" }) </div> ... // UI controller [HttpPost] public ActionResult Create(CreateContactViewModel model,GetContactsViewModel contactsModel) { /* Now validation work only on client side,should be fixed? */ var newContact = new Contact() { Email = model.Email,... }; UnitOfWork.ContactRepository.Insert(newContact); UnitOfWork.Save(); return GetContactsList(contactsModel); } // API Controller public class ContactsController : BaseApiController { ... public IHttpActionResult Post(Contact contact) { if (!ModelState.IsValid) { return BadRequest(ModelState); } UnitOfWork.ContactRepository.Insert(contact); try { UnitOfWork.Save(); } catch (DbUpdateException) { if (ContactExists(contact.Id)) { return Conflict(); } else { throw; } } return Created(contact); } ... } 我想更好的方法是将验证属性移动到模型中(以及将来会添加更复杂的业务逻辑验证)并在从ViewModel映射后手动检查模型有效性我在这里找到了相同的想法http://blogs.msdn.com/b/simonince/archive/2010/12/07/view-model-versus-domain-entity-validation-with-mvc.aspx.(手动验证调用适合我) 在这种情况下,我应该做些什么来支持API和UI中的验证? 可能应用程序架构不够好,我很高兴得到任何建议,但我现在还没有完全授权改变任何东西. 解决方法
正如您已经知道的那样(或计算出来),验证可以,将来也应该在许多层面上进行.
您需要做的第一件事是区分应该是UI验证的内容和应该是业务规则验证的内容. 假设我有一个寄存器< form> …< / form>.在该表单中,我有一个简单的电子邮件文本框. 假设我的规则如下: >电子邮件文本框是必填项 我可以快速区分强制文本框应该是UI验证. 至于“无重复电子邮件”规则,这需要访问数据库以查看给定的电子邮件地址是否尚不存在.对我来说,这是一个业务规则验证. 基本上,我的RegisterViewModel将在email属性上设置[required]数据注释属性.这将负责UI验证. 提交后,我将使用Model.IsValid()验证我的ViewModel以进行服务器端验证. 在API内部,我将调用数据库并检查给定的电子邮件地址是否已存在. 如果确实存在,则该方法将返回false(假设您的方法返回true或false). Controller将检查返回的值是否为false,并可能向UI添加一些错误. 如果它不存在,那就太好了!将ViewModel(如果之前尚未转换)转换为POCO(或称为Model对象),以便将其保存到数据库中. 在我的例子中(以及我的大多数POCO中)我很少有数据注释我通常将它们留给ViewModel以及我需要的任何更复杂的验证,我在API层中手动完成. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – ASP .NET AJAX和JQuery
- asp.net-mvc – MVC中的SSRS Reportviewer,通过自动调整ifr
- asp.net-core-mvc – 将jquery-globalize集成到ASP.NET Cor
- asp.net – .NET Signalr MapConnection已经过时了?
- asp.net核心 – Kestrel托管基础
- 将ASP.NET引入Thinking Request是Ajax请求jQuery文件上传
- ASP.NET 高性能分页代码
- asp.net – MVC 5使用旧表单身份验证而不是OWIN
- .net-core – VS 2017中缺少ASP.NET Core 2模板
- ASP.NET平台有相当于Heroku吗?