2011-02-03 220 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" } }) 

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