2011-12-07 177 views
4

我是MVC3的新手,並且第一次驗證表單。 我看到一些驗證樣本使用jQuery和使用Model.IsValid,但我不知道這是否是我的情況。MVC3簡單表單驗證

我使用@ Html.TextBox,並@ Html.ValidationMessage,我可以看到我需要把2條jQuery的線在我的文檔驗證:

<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> 

我看見許多人使用驗證只有使用jQuery,但我無法弄清楚它是如何工作的。那麼,你能否給我一個帶有jQuery(如果需要)和Controller的Razor View的示例驗證代碼?由於我沒有使用TextBoxFor,我相信我不能僅在Model類的Datannotations中使用驗證。

形式我需要驗證:

@Html.TextBox("user", "User:") 
@Html.TextBox("email", "Email:") <!-- with validation of email string --> 
@Html.Password("password") 
@Html.Password("passwordConfirm") <!-- with validation if 2 password strings match --> 

回答

17

jquery.validate.unobtrusive.min.js腳本可以與放置在您的模特屬性數據的註釋一起。那些驗證器屬性隨後由Html助手進行翻譯,以發送由腳本使用的HTML5數據屬性。如果您沒有使用驗證屬性裝飾的模型,則不能使用此腳本。

這就是說你仍然可以擁有一個帶驗證屬性的模型,並仍然使用TextBox而不是TextBoxFor。這將是完全愚蠢而且毫無意義的,但你可以做到這一點:當您使用內部的形式驗證屬性傭工的人會發出

public class MyViewModel 
{ 
    [Required] 
    public string MyProperty { get; set; } 
} 

,然後在您的視圖:

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.TextBox("MyProperty") 
} 

如果你沒有視圖模型(不知道你爲什麼沒有視圖模型,因爲這違背了我所說的良好實踐),你可以手動連接驗證。在這種情況下,你只需刪除jquery.validate.unobtrusive腳本,並使用核心JQuery驗證插件:

$(function() { 
    $('#id_of_your_form').validate({ 
     rules: { 
      MyProperty: { 
       required: true 
      } 
     }, 
     messages: { 
      MyProperty: { 
       required: 'Please enter a value for MyProperty' 
      } 
     } 
    }); 
}); 

顯然,推薦的解決方案是使用一個視圖模型和強類型的輔助:

public class RegisterViewModel 
{ 
    public string User { get; set; } 

    [DataType(DataType.EmailAddress)] 
    [Email] // taken from Scott Gu's blog post: http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx 
    public string Email { get; set; } 

    public string Password { get; set; } 

    [Compare("Password")] 
    public string PasswordConfirm { get; set; } 
} 

,然後在查看:

@model RegisterViewModel 
<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()) 
{ 
    <div> 
     @Html.LabelFor(x => x.User) 
     @Html.EditorFor(x => x.User) 
     @Html.ValidationMessageFor(x => x.User) 
    </div> 
    <div> 
     @Html.LabelFor(x => x.Email) 
     @Html.EditorFor(x => x.Email) 
     @Html.ValidationMessageFor(x => x.Email) 
    </div> 
    <div> 
     @Html.LabelFor(x => x.Password) 
     @Html.PasswordFor(x => x.Password) 
     @Html.ValidationMessageFor(x => x.Password) 
    </div> 
    <div> 
     @Html.LabelFor(x => x.PasswordConfirm) 
     @Html.PasswordFor(x => x.PasswordConfirm) 
     @Html.ValidationMessageFor(x => x.PasswordConfirm) 
    </div> 
    <button type="submit">Register</button> 
} 
+0

謝謝你的回答。 –

+0

達林,如果你有更復雜的驗證規則呢?我發現使用註釋非常麻煩,我寧願寫出jquery,即使我有一個視圖模型。 – SoftwareSavant

+1

@DmainEvent,是數據註釋不太適合複雜的驗證場景。我寧願在服務器上使用FluentValidation.NET來實現複雜的驗證方案,而在客戶端上只留下嚴格的最小值。如果您需要在客戶端上使用複雜的驗證規則,則可以手動編寫jquery驗證規則。 –