ASP.NET MVC 3 - 验证问题

mre*_*ros 6 asp.net-mvc-3

大家晚上好,我对下拉列表值的验证有疑问.我有一个视图绑定到一个名为的视图模型类型ReservationData.

该对象包含CustomerVehicles类型的属性List<VehicleData>. VehicleData有两个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>
    }
Run Code Online (Sandbox Code Playgroud)

好的,我也注意到在生成的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>
Run Code Online (Sandbox Code Playgroud)

另外在我的VehicleData班级中,VehicleMakeIdVehicleModelId属性用Required属性装饰.

更新:

好的,所以我正在测试并注意到如果我保持我的代码相同,除了我Html.DropdownListForHtml.TextboxFor调用交换调用然后验证工作.可能是什么导致了这个?这可能是一个不显眼的验证的框架错误?

更新:包含修复

因此,在ASP.NET论坛上发布同样的问题后,我得到了一个解决方案.在帖子中,您将能够看到不显眼的验证框架中存在错误以及它如何处理下拉列表的验证.用户counsellorben在解释问题以及解决方案(包括示例代码)方面做得很好,这些解决方案将帮助其他人在将来避免此问题,或者至少在Microsoft构建修复框架之前.

谢谢大家的帮助.

小智 0

您应该首先尝试在视图模型属性上添加数据注释,以便可以看到验证消息。

你可能会在这里找到你需要的东西

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

或者根据需要创建自定义的。

您到底需要验证什么?