当您使用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属性进行操作。
希望这会有所帮助。
你是指客户端,对吗?如果是,那么你有没有在视图中包含验证脚本 – 2012-01-06 13:10:14
你能显示你的代码吗? – 2012-01-06 14:00:37