2011-02-03 225 views
6

晚上好,我有一個關於下拉列表值驗證的問題。我有一個視圖綁定到名爲ReservationData的視圖模型類型。ASP.NET MVC 3 - 驗證問題

此對象包含List<VehicleData>類型的屬性CustomerVehiclesVehicleData有兩個int屬性VehicleMakeIdVehicleModelId

在我的觀點中,我試圖循環使用CustomerVehicles集合中的物品數量,並使用DropDownListFor爲每個物品顯示兩個下拉框,一個車輛下拉框和一個車型下拉框。

當我嘗試提交併驗證時,屏幕上未顯示任何驗證錯誤。

以防萬一您想知道我爲每個下拉列表添加了ValidationMessageFor。我不確定這是否與我的視圖模型的結構及其複雜性有關,以及如何命名控件或需要如何設置id。任何幫助將不勝感激。

下面是遍歷集合中的代碼:

@for (var i = 0; i < Model.CustomerVehicles.Count(); i++) 
    { 
     var vehicleNumber = i + 1; 
     <div class="vehicle-selection-wrapper"> 
      <div class="content-container"> 
       <h3> 
        Vehicle @vehicleNumber</h3> 
       <img class="vehicle-image" alt="manufacturer image" src="@Url.Content("~/Content/images/default-vehicle.gif")" /><br /> 
       @Html.LabelFor(m => m.CustomerVehicles[i].VehicleMakeId) 
       @Html.DropDownListFor(m => m.CustomerVehicles[i].VehicleMakeId 
      , new SelectList(Model.VehicleMakes, "Id", "Name") 
          , @UIDisplay.Dropdown_DefaultOption, new { @class = "long-field" })<br /> 
       @Html.ValidationMessageFor(m => m.CustomerVehicles[i].VehicleMakeId)<br /> 
       @Html.LabelFor(m => m.CustomerVehicles[i].VehicleModelId) 
       @Html.DropDownListFor(m => m.CustomerVehicles[i].VehicleModelId 
      , new SelectList(new List<CWR.Domain.VehicleModel>(), "Id", "Name") 
       , @UIDisplay.Dropdown_DefaultOption, new { @class = "long-field" }) 
       @Html.ValidationMessageFor(m => m.CustomerVehicles[i].VehicleModelId) 
      </div> 
     </div> 
    } 

確定,所以我還注意到,在生成的HTML所生成的選擇缺少其相關聯的元件的HTML5數據-VAL屬性來處理驗證。下面是生成的HTML

<select class="long-field" id="CustomerVehicles_0__VehicleMakeId"   name="CustomerVehicles[0].VehicleMakeId"><option value="">-- Select --</option> 
</select><br /> 
<span class="field-validation-valid" data-valmsg- for="CustomerVehicles[0].VehicleMakeId" data-valmsg-replace="true"></span><br /> 
<label for="CustomerVehicles_0__VehicleModelId">Model</label> 
<select class="long-field" id="CustomerVehicles_0__VehicleModelId" name="CustomerVehicles[0].VehicleModelId"><option value="">-- Select --</option> 
</select> 
<span class="field-validation-valid" data-valmsg-for="CustomerVehicles[0].VehicleModelId" data-valmsg-replace="true"></span> 

此外,在我VehicleDataVehicleMakeIdVehicleModelId性能都裝飾有一個Required屬性。

UPDATE:

好了,所以我在測試,發現如果我把我的代碼相同,除了我交換Html.DropdownListFor電話與Html.TextboxFor調用,那麼驗證工作。什麼可能導致這個?它可能是一個框架錯誤與不顯眼的驗證?

UPDATE:包含修復

所以在ASP.NET Forums張貼同樣的問題後,我能得到一個解決方案。在這篇文章中,您將能夠看到在不顯眼的驗證框架中存在一個錯誤,以及它如何處理下拉列表的驗證。用戶委員會在解釋問題方面做得很好,並且在將來幫助其他人避免這個問題的解決方案(包括示例代碼),或者至少在微軟修復框架之前做得很好。

謝謝大家的幫助。

+0

您是否有如何在視圖中使用此自定義助手的示例?謝謝。 – Brandon 2012-01-11 04:29:14

回答

0

您應該嘗試在您的視圖模型屬性中添加數據註釋,以便您可以看到驗證消息。

你可能會發現你需要在這裏

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx

,或者如果需要創建自定義的東西。

你究竟需要驗證什麼?

+0

就像確認你是否按照正確的模式關於如何使視圖驗證,如添加<%Html.EnableClientVAlidation(); %>幷包含必要的JavaScripts? – michaelalm 2011-02-03 01:08:00

2

我也在MVC 3中遇到過有關使用dropdownlists進行客戶端驗證的明顯的大規模監督,我可以提供的最佳解決方案是將丟失的HMTL屬性放入您自己。

在您的視圖模型中創建一個像這樣的屬性。

public Dictionary<string, object> CustomerVechicleAttributes 
    { 
     get 
     { 
      Dictionary<string, object> d = new Dictionary<string, object>(); 
      d.Add("data-val", "true"); 
      d.Add("data-val-required", "Please select a Vechicle."); 
      return d; 
     } 
    } 

然後在你的代碼,輸入

@Html.DropDownListFor(m => m.CustomerVehicles[i].VehicleMakeId 
      , new SelectList(Model.VehicleMakes, "Id", "Name") 
      , @UIDisplay.Dropdown_DefaultOption, 
      **Model.CustomerVechicleAttributes** }) 

只需添加Model.CustomerVechicleAttributes爲htmlAttributes你的下拉列表。 這將注入缺少的必要屬性。您當然需要添加您可能需要的任何其他屬性,例如您的類屬性。

希望這會有所幫助。

0

我和在TextBoxFor中正確驗證的字段完全相同,但在DropDownListFor中沒有。

@Html.DropDownListFor(m => m.PaymentTO.CreditCardType, Model.CreditCardTypeList, "Select Card Type", new { style = "width:150px;" }) 

因爲我有另一個DropDownListFor在同一頁上的工作,我知道這是不是一個普通的DropDownListFor問題。我也有一個複雜的模型,父對象PaymentTO沒有初始化。當我設置viewTO.PaymentTO = new PaymentTO();在Controller中,DropDownListFor的驗證開始工作。因此,DropDownListFor可能存在問題,但修復可能與初始化控制器中的對象一樣簡單。

2

這是我找到的最簡單的方式,只需在DropDownListForHtmlAttributes的視圖內添加data-val-*-*屬性即可。下面的方法與RemoteValidation工作也一樣,如果你不需要遠程驗證,只需刪除包含data-val-remote-*元素:

 @Html.DropDownListFor(m => m.yourlistID, (IEnumerable<SelectListItem>)ViewBag.YourListID, String.Empty, 
     new Dictionary<string, object>() { { "data-val", "true" }, 
     { "data-val-remote-url", "/Validation/yourremoteval" }, 
     { "data-val-remote-type", "POST" }, { "data-val-remote-additionalfield", "youradditionalfieldtovalidate" } }) 

我希望它可以幫助。最好的祝福!