此对象包含List< VehicleData>类型的属性CustomerVehicles. VehicleData有两个int属性VehicleMakeId和VehicleModelId.
在我看来,我试图循环使用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>(),new { @class = "long-field" }) @Html.ValidationMessageFor(m => m.CustomerVehicles[i].VehicleModelId) </div> </div> }
好的,我还注意到,在生成的HTML中,生成的选项缺少与处理验证的元素相关联的HTML5 data-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>
此外,在我的VehicleData类中,VehicleMakeId和VehicleModelId属性使用required属性进行修饰.
更新:
好的,所以我测试并注意到如果我保持我的代码相同,除了我用Html.TextBoxFor调用交换Html.DropdownListFor调用,然后验证工作.可能是什么导致了这个?这可能是一个不引人注意的验证的框架错误?
更新:包含修复
所以在ASP.NET Forums上发布同样的问题后,我得到了一个解决方案.在帖子中,您将能够看到不显眼的验证框架中存在错误以及它如何处理下拉列表的验证.用户counsellorben在解释问题方面做得很好,并且解决方案(包括示例代码)将帮助其他人在将来避免此问题,或者至少在Microsoft构建框架修复之前.
谢谢大家的帮助.
解决方法
在您的视图模型中创建这样的属性.
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,**Model.CustomerVechicleAttributes** })
只需将Model.CustomerVechicleAttributes作为htmlAttributes添加到您的下拉列表中.
这将注入缺少的必要属性.您当然需要添加您可能需要的任何其他属性,例如您的类属性.
希望这可以帮助.