为什么自定义验证不起作用?

时间:2012-01-06 12:45:05

标签: asp.net-mvc-3 razor

ASP.NET MVC3 / Razor新手问题:

我正在设置一个带有自定义验证的模型。虽然我用[Required][RegularExpression(...)]之类的东西装饰的属性正在按预期执行,但我发现自定义验证不起作用。我创建了我的模型实现IValidatableObject,我可以在Validate()方法中找到一个断点,并观察该方法执行yield return new ValidationResult(...); - 但该表格仍然会被发布。

是否有一些我遗漏的秘密开关?

2 个答案:

答案 0 :(得分:2)

如果您正在讨论服务器端验证,您是否有ModelState.Isvalid检查? http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

答案 1 :(得分:1)

使用IValidatableObject验证模型属性时,将发布表单。正如Joeri Jans所说,你仍然可以阻止这种情况,并在你的行动方法中将页面返回给用户:

public ActionResult MyAction(MyModel model)
{
    if (ModelState.IsValid)
    {
        // code to perform action when input is valid
        return [return something]
    }
    return View(model); // re-display form because ModelState.IsValid == false
}

如果您希望自定义验证阻止发布表单,则需要在客户端上进行验证。最简单的方法是使用RemoteAttribute。

public class MyModel
{
    [Remote("MyValidateAction", "MyController", HttpMethod = "POST")]
    public string MyProperty { get; set; }
}

您仍然可以将代码保存在IValidatableObject中,并通过如下操作方法对其进行验证:

[HttpPost]
public virtual JsonResult MyValidateAction(string myProperty)
{
    var model = new MyModel{ MyProperty = myProperty, };
    var results = new List<ValidationResult>();
    var isValid = Validator.TryValidateObject(model, 
        new ValidationContext(model, null, null), results, true);
    return isValid
        ? Json(true)
        : Json(results[0].ErrorMessage);
}

上述操作方法与默认模型绑定器几乎完全相同。它构造了viewmodel的一个实例,然后验证它。将检查所有验证规则,包括您的IValidatableObject代码。如果需要向构造viewmodel的action方法发送更多属性,可以使用RemoteAttribute的AdditionalFields属性执行此操作。

希望这有帮助。