2011-05-26 267 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