C# ASP.NET MVC4引导模式验证
我在提交表单之前验证引导模式中的用户输入时遇到问题。 我有一个具有此属性的类C# ASP.NET MVC4引导模式验证,c#,asp.net,asp.net-mvc-4,unobtrusive-validation,C#,Asp.net,Asp.net Mvc 4,Unobtrusive Validation,我在提交表单之前验证引导模式中的用户输入时遇到问题。 我有一个具有此属性的类 [FooValidation] [MaxLength(50)] [Required] public string Foo {get;set;} foo属性必须是唯一的,因此我创建了FooValidation属性,如下所示: public class FooValidationAttribute : ValidationAttribute { public override bool IsValid(objec
[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)
同样如此,但结果是一样的。表格确实会被提交。但是
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("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
谢谢,这似乎在某种程度上起作用,尽管每次调用isfooinuque方法时,参数Foo始终为null,知道为什么吗?检查您的页面,看看是否有名为Foo
(与参数相同)的输入。您可能有一个前缀,如Model.Foo
。在这种情况下,您应该将[Bind(Prefix=“Model.Foo”)]添加到isfoouunique操作的Foo参数中,或者将操作更新为public JsonResult isfoouunique(Model Model)
,并使用Model.Foo
和Model.ID
进行检查。是的。非常感谢你的帮助