2011-05-26 113 views
1

我有一个非常简单的例子试图MVC3使用数据注释与非侵入式JavaScript:ASP.net MVC验证与jQuery验证混合dataannotations验证失败时

型号:

public class RegisterModel { 
    [Required] 
    public string EmailAddress { get; set; } 

    [Required] 
    public string FirstName { get; set; } 
} 

控制器:

public class HomeController : Controller { 
    public ActionResult Index() { 
     return View(new RegisterModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(RegisterModel model) { 
     return View(model); 
    } 
} 

查看:

@model RegisterModel 

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using(Html.BeginForm("Index", "Home", FormMethod.Post, new { id = "mainForm" })) { 
    @Html.EditorFor(m => m.FirstName)<br/> 
    @Html.ValidationMessageFor(m => m.FirstName)<br/> 

    @Html.EditorFor(m => m.EmailAddress)<br/> 
    @Html.ValidationMessageFor(m => m.EmailAddress)<br/> 

    <input type="submit" value="Submit" /> 
} 

一切工作正常。当表单为空时,当我点击提交按钮时,它阻止我提交。它输出不显眼的JavaScript并进行客户端验证。我想要做一些远程验证,以确保电子邮件地址没有被使用,所以我增加了以下的观点:

<script type="text/javascript"> 
    $("#mainForm").validate({ 
     rules: { 
      EmailAddress: { 
       email: true, 
       remote: { 
        url: "@Url.Action("CheckForValidEmail")", 
        type: "post" 
       } 
      } 
     }, 
     messages: {     
      EmailAddress: { 
       email: "You must provide a valid e-mail address.", 
       remote: jQuery.format("The email {0} is already in use.") 
      } 
     } 
    }); 
</script> 

只要我添加此我的验证停止工作。我认为这是因为我将数据注释验证与jQuery验证混合在一起。

如果我删除[必需]从模型属性和它添加到我的剧本,然后一切正常:

FirstName: { required: true }, 
EmailAddress: { required: true, email: true, remote ... } 

,一切工作正常。

我是否必须放弃不显眼的JavaScript验证才能使用此远程验证?有没有办法用不显眼的JavaScript做远程验证?

回答

2

是的问题来自于您将另一个验证处理程序附加到与jQuery不引人注意的验证附加的表单冲突的表单。

要做到这一点,你可以使用Remote属性:

public class RegisterModel { 
    [Required] 
    [Remote("CheckForValidEmail", "Home")] 
    public string EmailAddress { get; set; } 

    [Required] 
    public string FirstName { get; set; } 
} 

CheckForValidEmail行动HomeController

public ActionResult CheckForValidEmail(string emailAddress) 
{ 
    if (repository.IsValid(emailAddress)) 
    { 
     // If you return a JSON string the model will be considered 
     // invalid and this string will be used as error message 
     return Json(
      string.Format(
       "The email {0} is already in use.", 
       emailAddress 
      ), 
      JsonRequestBehavior.AllowGet 
     ); 
    } 
    // Return true to indicate that the email address is valid 
    return Json(true, JsonRequestBehavior.AllowGet); 
} 

现在你不再需要编写任何JavaScript。

+0

非常感谢。有没有办法控制它发回控制器的频率?目前它似乎是在我键入时做的,我不希望它每次输入一个字符时都会进行远程调用。我宁愿让它以较慢的速度执行,或者在他们退出文本框之后执行。 – Dismissile 2011-05-26 17:36:40