2010-05-27 88 views
1

我想在我的應用程序的asp.net.net MVC 2.0中做一些驗證。我想要有一些很好的客戶端驗證。 DataAnnotations具有自定義屬性(比如CompareTo,StringLenght,MinPasswordLenght(來自Membership.MinimumumpassworkdLenght值),因此在模型端應該大多數時間進行驗證。 爲此,我嘗試使用xval和jquery.validation。 一些特定的事情是:的形式將與阿賈克斯和大多數問題是工作的時候我想驗證表單與AJAX。asp .net MVC 2.0驗證

這裏是鏈接樣本項目http://www.sendspace.com/file/m9gl54

我有兩種形式作爲對照ValidFormControl1.ascx,ValidFormControl2.ascx

<% using (Ajax.BeginForm("CreateValidForm", "Test", new AjaxOptions { HttpMethod = "Post" })) {%> <div id="validationSummary1"> 
    <%= Html.ValidationSummary(true)%> </div> <fieldset> 
    <legend>Fields</legend> 
    <div class="editor-label"> 
     <%= Html.LabelFor(model => model.Name)%> 
    </div> 
    <div class="editor-field"> 
     <%= Html.TextBoxFor(model => model.Name)%> 
     <%= Html.ValidationMessageFor(model => model.Name)%> 
    </div> 
    <div class="editor-label"> 
     <%= Html.LabelFor(model => model.Email)%> 
    </div> 
    <div class="editor-field"> 
     <%= Html.TextBoxFor(model => model.Email)%> 
     <%= Html.ValidationMessageFor(model => model.Email)%> 
    </div> 
    <div class="editor-label"> 
     <%= Html.LabelFor(model => model.Password)%> 
    </div> 
    <div class="editor-field"> 
     <%= Html.TextBoxFor(model => model.Password)%> 
     <%= Html.ValidationMessageFor(model => model.Password)%> 
    </div> 
    <div class="editor-label"> 
     <%= Html.LabelFor(model => model.ConfirmPassword)%> 
    </div> 
    <div class="editor-field"> 
     <%= Html.TextBoxFor(model => model.ConfirmPassword)%> 
     <%= Html.ValidationMessageFor(model => model.ConfirmPassword)%> 
    </div> 
    <p> 
     <input type="submit" value="Create" /> 
    </p> </fieldset> <% } %> <%= Html.ClientSideValidation<ValidModel>() 
    .UseValidationSummary("validationSummary1", "Please fix the following problems:") %> 

兩者看起來相同,區別僅在於驗證summaryID(validationSummary1,validationSummary2)。這兩個控件呈現在一個頁面上:

Form2 
    <%Html.RenderPartial("~/Views/Test/ValidFormControl2.ascx", null); %> 
Form1 

<%Html.RenderPartial("~/Views/Test/ValidFormControl.ascx", null); %> 

驗證屬性

第一個問題,當我們有相同類型的兩個控件來驗證它不工作becosue HTML元素通過字段名渲染(所以我們有兩個具有相同名稱「密碼」的元素)。只有第一種形式將由客戶端驗證。 最糟糕的是,即使我們有不同的類型和他們的字段名稱是相同的驗證也不會工作(這件事是我需要修復它將愚蠢命名一些獨特的驗證合適的)。

有沒有解決方案?

自定義屬性驗證

接下來的事情自定義屬性驗證(當我使用Ajax爲正常表單驗證工作沒有問題所有這些錯誤都是。):

的CompareTo - 簡單比較這是在用於帳戶模型的mvc模板中完成的(具有兩個屬性的類屬性將被比較),並且它不在頁面上顯示。爲此,我使用compareRule和我的屬性創建了自己的CachingRulesProvider。也許有更簡單的方法來做到這一點?

StringLenght具有最小值和最大值,我不會描述我是如何做到的,但是有沒有簡單的乳清來做到這一點?

驗證摘要

當我有兩個頁面上的兩個控制所有彙總驗證信息轉到了第一控制驗證摘要元素,甚至XVAL生成的腳本說,elementID是總結不同。任何一個知道如何修復它?

驗證信息

是否有任何選項打開消息在地方其中Html.ValidationMessageFor(型號=> model.ConfirmPassword)。 Becsoue對我來說它沒有出現。我想不僅有紅色邊框,還有總結和近場信息。任何人都知道如何去做?

阿賈克斯提交

任何人都知道如何在不大規模的代碼做容易在JavaScript中,通過JavaScript提交。這將用於改變輸入提交給href元素(a)。 兩者看起來相同,區別只是驗證總結ID

+3

這裏有很多有效的問題。 SO更適合單個問題。可能需要將這些問題解決並重新張貼以獲得答案。 – 2010-05-27 15:05:41

回答

0

首先,我不知道爲什麼你想要兩個控件,有兩個相同的字段,一種形式。每個表單都應該有自己的模型,並使用模型作爲驗證器。

命名空間Sample.Models { [元類型(typeof運算(PersonaValidation))] 公共局部類Person { } 公共類PersonValidation { [必需(的ErrorMessage = 「名字必需」)] [ StringLength(20,ErrorMessage =「名字長度不得超過20個字符」)] [DisplayName(「First Name」)] public string Firstname {get;組; }

[Required(ErrorMessage = "Last name Required")] 
    [StringLength(20, ErrorMessage = "Last name must be 20 or less characters in length")] 
    [DisplayName("Last Name")] 
    public string Lastname { get; set; } 

}}

在你的aspx,形式標記前添加下面的腳本文件:

<h2>Validation Sample</h2> 

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script> 
<script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script> 
<script src="/Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script> 
<% Html.EnableClientValidation(); %> 

<% using (Html.BeginForm()) {%> 
    <%= Html.ValidationSummary(true) %> 
     <fieldset> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.Firstname) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.Firstname) %> 
      <%= Html.ValidationMessageFor(model => model.Firstname) %> 
     </div> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.Lastname) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.Lastname) %> 
      <%= Html.ValidationMessageFor(model => model.Lastname) %> 
     </div> 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 

<% } %> 

這將工作每次。錯誤消息將顯示在無效字段旁邊。

0

關於ajax提交,你可以在你的表單上放一個按鈕,然後通過jQuery點擊它。這也會導致您的表單被張貼。

您也可以對控制器操作進行ajax調用(單擊鏈接),然後在此處發佈表單中必要的數據。