【发布时间】:2014-05-16 17:05:45
【问题描述】:
我有一个包含 Model 和 ViewModel 的 ASP.Net MVC 应用程序,这个应用程序有 UI 和 API 接口,可通过不同的控制器工作,UI 与 ViewModel 一起工作,API 与 Model 一起工作。 ViewModel 使用数据注释(C# 属性)进行验证,而 Model 没有,因此现在 API 允许将任何不一致的模型保存到数据库。
我现在拥有的:
// 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 中的验证?
可能是应用架构不够好,我很高兴得到任何建议,但我现在无权更改任何内容。
【问题讨论】:
标签: asp.net-mvc validation viewmodel