【发布时间】:2011-02-03 00:35:42
【问题描述】:
大家晚上好,我有一个关于验证下拉列表值的问题。我有一个绑定到名为ReservationData 的视图模型类型的视图。
此对象包含 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>(), "Id", "Name")
, @UIDisplay.Dropdown_DefaultOption, 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.DropdownListFor 调用与Html.TextboxFor 调用交换,那么验证工作。这可能是什么原因造成的?会不会是不显眼的验证的框架错误?
更新:包含修复
所以在ASP.NET Forums 上发布了同样的问题后,我得到了解决方案。在这篇文章中,您将能够看到不显眼的验证框架中存在一个错误,以及它如何处理下拉列表的验证。用户顾问本很好地解释了问题以及解决方案(包括示例代码),这将有助于其他人在未来避免此问题,或者至少在 Microsoft 在框架中构建修复程序之前。
感谢大家的帮助。
【问题讨论】:
-
您有如何在视图中使用此自定义助手的示例吗?谢谢。
标签: asp.net-mvc-3