您当然可以使用 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 类驻留在那里,但我认为这不是问题。