2012-01-06 72 views
1

ASP.NET MVC3/Razor新手问题:为什么不自定义验证工作?

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

有一些秘密开关,我失踪了吗?

+2

你是指客户端,对吗?如果是,那么你有没有在视图中包含验证脚本 – 2012-01-06 13:10:14

+0

你能显示你的代码吗? – 2012-01-06 14:00:37

回答

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); 
} 

以上操作方法做几乎同样的事情作为默认的模型粘合剂。它构建你的视图模型的一个实例,然后验证它。所有的验证规则都会被检查,包括你的IValidatableObject代码。如果需要将更多属性发送到构建视图模型的操作方法,则可以使用RemoteAttribute的AdditionalFields属性进行操作。

希望这会有所帮助。

+0

+1并回答信用以获得全面的答案。谢谢! – 2012-01-07 19:07:42

2

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

+1

这不是一个答案,这是一个问题。问题的评论部分的问题会更好。 – Dangerous 2012-01-06 14:13:21

+0

@危险 - 公正的评论,但无论如何指出我失踪。 – 2012-01-07 19:07:21

+0

@危险我把它放在这里,因为我没有看到对这个问题发表评论的选项。 – JoJa 2012-01-09 14:43:59