【问题标题】:How to add custom validate method for viewmodel如何为视图模型添加自定义验证方法
【发布时间】:2011-11-23 16:08:36
【问题描述】:

我尝试为 ViewModel 类添加自定义验证器:

[Serializable]
public class UserViewModel : IValidatableObject 
{
    public IEnumerable<ValidationResult> Validate(ValidationContext context)
    {
        yield return new ValidationResult("Fail this validation");
    }
}

不幸的是,当调用 Action 方法时,这不会触发,例如

    [HttpPost]
    public ActionResult Edit(UserViewModel user)

如何添加自定义验证逻辑? ValidationAttribute 没有提供足够简单的解决方案。我找不到有关 MVC2 验证机制的明确信息。

【问题讨论】:

  • 您确定您使用的是 MVC 版本 2?我不认为 IValidatableObject 在版本 3 之前可用。

标签: asp.net validation asp.net-mvc-2 viewmodel


【解决方案1】:

IValidatableObject 在 ASP.NET 2.0 中不受支持。在 ASP.NET MVC 3 中添加了对该接口的支持。您可以定义自定义属性:

[AttributeUsage(AttributeTargets.Class)]
public class ValidateUserAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        UserViewModel user = value as UserViewModel;
        // TODO: do some validation

        ErrorMessage = "Fail this validation";
        return false;
    }
}

然后用这个属性装饰你的视图模型:

[Serializable]
[ValidateUser]
public class UserViewModel
{

}

【讨论】:

  • 谢谢。看来我对如何正确使用 ValidationAttribute 有点一头雾水。
【解决方案2】:

您的语法看起来不错。在您尝试验证模型之前,验证不会“触发”。您的控制器代码应如下所示

[HttpPost]
public ActionResult Edit(UserViewModel user)
{
    if(ModelState.IsValid)
    {
        // at this point, `user` is valid
    }

    // since you always yield a new ValidationResult, your model shouldn't be valid
    return View(vm);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2011-11-14
    • 1970-01-01
    • 2012-11-20
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多