【发布时间】:2016-10-19 15:12:19
【问题描述】:
我有一个 asp.net MVC 5 网站。
我在模型上使用数据注释进行验证 - 例如
[Required]
public string FirstName { get; set; }
但是,如果我想做一些更复杂的验证,比如说需要一个将来的日期 - 我看到的所有示例都只是在控制器中执行验证 - 例如:
[HttpPost]
public ActionResult Edit(MyViewModel vm)
{
// check date is in future
if (vm.mydate < DateTime.Now())
ModelState.IsValid = false;
if (ModelState.IsValid)
{
//Business Logic
}
即使是 Web 表单,您也可以将验证逻辑分离到 CustomValidator 中。将验证逻辑直接放入控制器并与业务逻辑混合使用感觉不对。
(注意 - 虽然我想知道如何用数据注释解决这个特定问题 - 我也想知道关于分离验证逻辑的更大问题的答案)。
是否有最佳实践或强制框架将其分开?我没有在网上找到的任何示例网站中看到它。
我是否过度担心这一点 - 这是控制器执行验证的目的的一部分吗?我的业务逻辑是否应该在模型中? (BL 在很大程度上实际上只是在写入数据库,所以也许这甚至不算作 BL?)。
谢谢。
【问题讨论】:
-
你可以试试 RangeAttribute (MSDN) msdn.microsoft.com/en-us/library/…
-
好的 - 谢谢 - 但是我关于分离验证逻辑的重要观点如何?
-
您可以制作自定义模型绑定器,在绑定模型时进行验证,也可以创建自定义操作过滤器来验证模型
-
我找到了这个例子 (c-sharpcorner.com/UploadFile/rahul4_saxena/…),抱歉我没试过这个
-
试用 Fluent 验证 - fluentvalidation.codeplex.com/wikipage?title=mvc