使用DataAnnotations属性的MVC内置模型验证非常有效,并且可以加速开发。但是,在许多情况下,无法在应用程序的表示层中处理验证,例如,检查数据库中是否存在唯一属性的现有值。
我正在寻找满足以下要求的解决方案:
[ValidateServiceLayer]
。这些功能的额外要点:
我对如何自己实现这个有一些想法,但在我发明轮子之前,我想知道它是否已经被其他人完善了。有人碰到这样的事吗?
答案 0 :(得分:3)
您当然可以使用RemoteAttribute,这是一个合法的解决方案,但我有时会选择不同的方法。我不确定这是最好的解决方案,但它适用于我,我认为这可能值得一提。
我的每个模型类都继承自如下所示的基本模型:
public abstract class BaseModel
{
private ModelStateDictionary _modelState = new ModelStateDictionary();
public ModelStateDictionary ModelState
{
get
{
return _modelState;
}
set
{
_modelState = value;
}
}
}
这种方式在我的控制器中我可以做类似的事情:
[HttpPost]
public ActionResult EditUser(user model)
{
if (ModelState.IsValid)
{
model.ModelState = ModelState;
_userService.Update(model);
}
if (ModelState.IsValid)
{
// Edit user was successful - No validation issues in business logic.
return View("Users");
}
return View(model);
}
因为我们将ModelState作为属性添加到您的所有模型中,您现在可以通过模型实例在服务逻辑中操作它。例如,如果您的服务中出现验证问题,您可以执行以下操作:
model.ModelState.AddModelError("Property Name", "Error Text");
这里唯一的开销是在你的控制器操作中你检查ModelState.IsValid两次,一次是在你打电话给服务之前,一次是在你打电话之后。
就像我说的那样,我不确定这是完美的,但它对我们有用。由你来决定哪种方法最适合你。
注意:您必须将System.Web.Mvc程序集的引用添加到服务层,因为ModelStateDictionary类驻留在那里,但我不认为这是一个问题。
答案 1 :(得分:2)
ASP.NET MVC提供了一种机制,可以进行远程服务器调用,以便验证表单字段,而无需将整个表单发布到服务器。该机制称为远程验证。
请看一下:http://msdn.microsoft.com/en-us/library/gg508808(v=vs.98).aspx