ASP.NET MVC3 / Razor新手问题:
我正在设置一个带有自定义验证的模型。虽然我用[Required]
和[RegularExpression(...)]
之类的东西装饰的属性正在按预期执行,但我发现自定义验证不起作用。我创建了我的模型实现IValidatableObject
,我可以在Validate()
方法中找到一个断点,并观察该方法执行yield return new ValidationResult(...);
- 但该表格仍然会被发布。
是否有一些我遗漏的秘密开关?
答案 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属性执行此操作。
希望这有帮助。