【问题标题】:Separating validation logic from business logic in asp.net MVC 5 controller在 asp.net MVC 5 控制器中将验证逻辑与业务逻辑分离
【发布时间】: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?)。

谢谢。

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-5


【解决方案1】:

您需要实现您的自定义验证属性。

创建一个新类并添加:

public sealed class ValidFutureDate : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            DateTime InputDate = Convert.ToDateTime(value);

            if (InputDate <= DateTime.Now)
            {
                return new ValidationResult("Inputed date must be in the future.");
            }
        }
        return ValidationResult.Success;
    }
}

您需要添加对System.ComponentModel.DataAnnotations的引用

在您的 ViewModel 中,您可以像使用其他所有属性一样使用该属性:

[Required]
[ValidFutureDate]
public DateTime Date { get; set; }

【讨论】:

  • 这让我可以放上注释 - 但它不会引发日期过去的错误。
  • 您的视图中是否包含 jqueryval?
  • 跨度>
  • 即使在视图中无论如何都不起作用,这是否应该在服务器上不起作用?
  • 对我来说效果很好:@Html.TextBoxFor(m =&gt; m.Date, new { @class = "form-control" })@Html.ValidationMessageFor(m =&gt; m.Date, "", new { @class = "text-danger" })。这是我的看法
猜你喜欢
  • 2015-05-15
  • 1970-01-01
  • 2013-12-15
  • 2017-08-08
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
相关资源
最近更新 更多