18

我有一個RangeValidator在我的模型屬性只允許整數介於0和100之間。我有一個局部視圖,顯示一個表單通過jQuery UI對話框更新屬性。我查看了源代碼並可以確認正在生成數據註釋屬性。但是,驗證工作不正常。它確實執行某種驗證,但它沒有使用我設置的範圍。值1,10和100不會產生錯誤。任何其他單個或兩位數值都會產生錯誤。但是,如果我使用零填充,則所有小於一百的值都可以。MVC數據註釋範圍驗證工作不正常

型號:

public class MyModel 
{ 
    ... 
    [Required(ErrorMessage = "{0} is required")] 
    [Range(typeof(int), "0", "100", 
     ErrorMessage = "{0} can only be between {1} and {2}")] 
    public int Percentage { get; set; } 
    ... 
} 

管窺:生產

@model MyApp.Models.Partials.MyModel 

<div id="myDialog" class="editModal" title="Update Percentage"> 
    @using (Ajax.BeginForm("UpdatePercentage", "MyController", 
         new AjaxOptions() { HttpMethod = "Post", 
              OnSuccess = "onUpdateSuccess" }, 
         new { name = "myForm" })) 
    { 
    @Html.ValidationSummary(null, new { style = "width:auto;max-width:22em;    
               float:left;clear:both;" })  
    <div style="width:auto;float:left;clear:both;"> 
     <div style="width:10em;float: left;text-align:right;clear:left;"> 
     @Html.Label("Percentage:") 
     </div> 
     <div style="width:12em;margin-left:1em;float:left;clear:right;"> 
     @Html.TextBoxFor(m => m.Percentage) 
     </div> 
    </div> 
    <div style="width:23em;clear:both;text-align:center;"> 
     <hr /> 
     <input type="button" value="Cancel" class="cancelModalButton" 
      data-modal="myDialog" /> 
     <input type="submit" value="Submit" class="submitModalButton" 
      data-modal="myDialog" data-form="myForm" /> 
    </div> 
    } 
</div> 

標記:

<div id="myDialog" class="editModal" title="Update Percentage"> 
    <form action="/Web/MyController/UpdatePercentage?Length=3" 
     data-ajax="true" data-ajax-method="Post" data-ajax-success="onUpdateSuccess" 
     id="form2" method="post" name="myForm"> 
    <div class="validation-summary-valid" data-valmsg-summary="true" 
     style="width:auto;max-width:22em;float:left;clear:both;"> 
     <ul> 
     <li style="display:none"></li> 
    </ul> 
    </div> 
    <div style="width:auto;float:left;clear:both;margin-bottom:.75em;"> 
     <div style="width:10em;float: left;text-align:right;clear:left;"> 
     <label for="Percentage:">Percentage:</label> 
     </div> 
     <div style="width:12em;margin-left:1em;float:left;clear:right;"> 
     <input data-val="true" data-val-number="The field Percentage must be a number." 
       data-val-range="Percentage can only be between 0 and 100" 
       data-val-range-max="100" data-val-range-min="0" 
       data-val-required="Percentage is required" id="Percentage" 
       name="Percentage" type="text" value="10" /> 
     </div> 
    </div> 
    <div style="width:23em;clear:both;text-align:center;"> 
     <hr /> 
     <input type="button" value="Cancel" class="cancelModalButton" data-modal="myDialog" /> 
     <input type="submit" value="Submit" class="submitModalButton" data-modal="myDialog" data-form="myForm" /> 
    </div> 
    </form> 
</div> 

我看到類型設置爲text,如果我改變我的TextBoxForEditorFor它chnages到number但我仍然看到相同的行爲。

+0

這是一個突破對jQuery的更改的問題,請參閱:http://stackoverflow.com/questions/14889431/client-side-validation-trips-on-dataannotation -range-attribute – felickz 2013-06-05 22:17:17

回答

7

我有這個確切的問題,並找到解決方案here。您需要升級以下:

jQuery驗證(至少1.11.1)
微軟jQuery的不顯眼的驗證(至少2.0.30116.0)
微軟不顯眼的jQuery阿賈克斯(至少2.0.30116.0)

這個問題是通過突破jQuery 1.9.1的變化而引入的

+0

這確實最終會成爲問題,正如felickz在一段時間後指出的那樣,但由於您是第一個將其作爲正式答案提出來的人,所以我會給您一個信貸來標記它已解決。 – stopher 2013-07-17 20:43:56

+0

謝謝。我從這裏開始並遵循felickz的鏈接...然後從那裏到GitHub上的問題的鏈接...然後滾動到一個評論說,jQuery驗證1.11.1修復它....所以我想我會讓它對於後面的任何事情都會更容易 – Colin 2013-07-18 08:07:12

3

嘗試[Range(0, 100)]。完全刪除ErrorMessage以查看您沒有破壞任何格式不正確和大括號。

如果純粹的範圍不能正常工作讓力(MS)與你同在! :)

+0

完成。同樣的錯誤。從模型中刪除了所有其他屬性,刪除了'Required'註釋,將'Range'更改爲您在此處的內容。我甚至採取了這種形式,並將其從「部分」視圖中移出,並使其不再是對話框。同樣的錯誤。然後我將數據註釋從等式中刪除。我將標記直接生成並插入到頁面中,而不是從模型中生成。同樣的錯誤。 – stopher 2013-03-13 13:41:59

+1

在這個時候,你需要*力*與你在一起:) 我會開始註釋掉你的部分代碼來隔離問題。因爲'Range'一路工作,所以沒有問題,我認爲這可能是一些衝突或版本不匹配,但我不希望論壇上的人員會爲您遠程調試此事。只要隔離問題。其他行爲方式(如果你還沒有太多的代碼)將只是創建新的解決方案,並通過檢查每一次你帶來一些'Range'仍然有效的新東西來移動你的代碼。希望這可以幫助。 – 2013-03-13 13:57:20

+1

我真的很感謝你的幫助,但我決定只是爲了踢,並使用RegularExpression驗證器,而這在我的情況下也是可行的。我花了太多時間。我想MS贏得這輪... – stopher 2013-03-13 15:01:11