我在表单提交之前验证bootstrap模式中的用户输入是一个问题。 我有一个有这个属性的课
[FooValidation]
[MaxLength(50)]
[Required]
public string Foo {get;set;}
foo属性必须是唯一的,这就是我创建FooValidation属性的原因,如下所示:
public class FooValidationAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
//logic
return true;
}
}
在我看来,我有
@Html.TextBoxFor(model => model.Foo, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Foo)
现在问题是,默认属性(Required和MaxLength)工作正常,当我尝试提交表单时,我得到了正确的错误消息,但我的自定义属性没有,调用IsValid方法并返回正确的值但无论如何都会提交表格。 知道什么可能是错的吗?
PS:我试图覆盖这个方法
ValidationResult IsValid(object value, ValidationContext validationContext)
但结果也一样。
答案 0 :(得分:0)
表格确实会提交。但是ModelState.IsValid
应该返回false
并且您应该返回到您的视图而不更新数据:
public ActionResult SaveData(Model model)
{
if (ModelState.IsValid)
{
// update here
// then redirect to view
return RedirectToAction("View", new { id = model.ID });
}
return View(model);
}
如果您想阻止发布表单,则应执行Remote
验证。
在您的模型中添加:
[Remote("IsFooUnique", AdditionalFields="ID", ErrorMessage="Foo is already in use")]
[MaxLength(50)]
[Required]
public string Foo {get;set;}
这在你的控制器中:
public JsonResult IsFooUnique(int ID, string Foo)
{
bool isUnique = false; // ... your logic here
return Json(isUnique, JsonRequestBehavior.AllowGet);
}
这将在客户端验证(突兀或不引人注目),并将阻止您的表单被提交。并且还将在服务器端验证,在保存数据的控制器方法中,还将ModelState.IsValid
设置为false
。