ASP.MVC3 ModelState.IsValid不包括RemoteAttribute检查

dan*_*iel 5 validation unobtrusive modelstate asp.net-mvc-3

我将变量定义为

public class EditModel
{
    [Remote("IsNameAvailable", "Home", ErrorMessage = "Name is in use.")]
    [Display(Name = "Name")]
    public string Name{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并在家庭控制器中

public JsonResult IsNameAvailable(string name)
{
    if (duplicate)
        return Json(false, JsonRequestBehavior.AllowGet);
    else
        return Json(true, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)

但是当我在Save操作中检查ModelState.IsValid时,它总是返回true,即使我可以在View上看到错误消息显示.

public ActionResult Save(EditModel editModel)
{
   if (!ModelState.IsValid)
   {
       //Return to view and display error in view
       return View("Home", editModel);
   }

   //Input data is valid and save record
   Repository.Save(editModel.Name);
}
Run Code Online (Sandbox Code Playgroud)

[问题]
ModelState如何在模型中检查RemoteAttribure的验证规则?

J.P*_*rge 2

你有两个选择。您可以实现 IDataErrorInfo 或 IValidatableObject 接口并在那里重做验证。这些接口由 MVC 开箱即用地支持,您的 ModelState 将反映这一点。

您的另一个选择是创建您自己的从 RemoteAttribute 派生的属性。在此自定义属性中,添加用于在服务器端应用相同验证的逻辑。

最后一个选项是我想要的,但这确实花费了更多时间。这个问题应该可以帮助你解决这个问题。

  • RemoteAttribute 的 IsValid 方法实际上确实在服务器端被调用。如果您使用 .NET 反编译器查看此方法,您会发现此方法所做的只是“return true;”。创建您自己的从 RemoteAttribute 派生的属性,并将一些实际的验证逻辑放入 IsValid() 方法中。例如,您可以在自己的属性上创建一个额外的属性,例如 ValidationMethod。使用该属性时,您可以传递应执行验证的方法。在 IsValid() 方法中,您可以调用该验证方法。 (2认同)