asp.net-mvc-3 – ASP.NET MVC 3 – 验证问题

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-3 – ASP.NET MVC 3 – 验证问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
大家晚上好,我对下拉列表值的验证有疑问.我有一个绑定到名为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>(),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构建框架修复之前.

谢谢大家的帮助.

解决方法

我也遇到过有关客户端验证的明显大规模监督,使用MVC 3中的下拉列表,我可以提供的最佳解决方案是将缺少的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,**Model.CustomerVechicleAttributes** })

只需将Model.CustomerVechicleAttributes作为htmlAttributes添加到您的下拉列表中.
这将注入缺少的必要属性.您当然需要添加您可能需要的任何其他属性,例如您的类属性.

希望这可以帮助.

猜你在找的asp.Net相关文章