ASP.NET MVC,用于将验证消息从服务层验证传输到视图模型的解决方案
本文关键字:验证 传输 视图 解决方案 模型 服务 MVC NET 用于 消息 ASP | 更新日期: 2023-09-27 18:30:13
MVC使用DataAnnotations属性进行的内置模型验证运行良好,大大加快了开发速度。然而,在许多情况下,验证无法在应用程序的表示层中处理,例如,检查数据库中是否存在唯一属性的现有值。
我正在寻找一个满足以下要求的解决方案:
- 与NInject(和其他DI方法)兼容
- 不会破坏SoC。服务层必须完全不知道表示层
- 是自动的。在表示层中(至少)产生最少的额外代码。思考
[ValidateServiceLayer]
的行动方法 - 坚持DRY原则。最少的代码复制
- 将验证消息分配给正确的属性(需要时)
- 允许在运行之前和之后添加其他验证消息
这些功能的附加点:
- 优雅地捕捉异常并显示用户友好的错误消息
- 易于使用。(NuGet包?)
我自己对如何实现这一点有一些想法,但在我开始发明轮子之前,我想知道它是否已经被其他人完善了。有人碰到这样的东西吗?
您当然可以使用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类驻留在其中,但我认为这不是问题。
ASP.NET MVC提供了一种机制,可以进行远程服务器调用,以便在不将整个表单发布到服务器的情况下验证表单字段。称为远程验证的机制。
请看一下:http://msdn.microsoft.com/en-us/library/gg508808(v=vs.98).aspx