ASP.NET MVC4 Bootstrap 模态验证

ASP.NET MVC4 Bootstrap modal validation

我在提交表单之前验证 bootstrap 模态中的用户输入时遇到问题。 我有一个 class 这个 属性

[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 方法被调用并且 returns 正确的值,但无论如何都会提交表单。 知道哪里出了问题吗?

PS: 我试图覆盖这个方法

ValidationResult IsValid(object value, ValidationContext validationContext)

也是,但结果是一样的。

表单确实会被提交。但是 ModelState.IsValid 应该 return false 并且您应该 return 在不更新数据的情况下查看:

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