MVC 4下拉验证
本文关键字:验证 4下 MVC | 更新日期: 2023-09-27 18:28:25
好吧,这让我抓狂。我有一个MVC 4网站,它正在验证客户端上的文本框,但不是下拉列表。
我的(精简版)模型如下:
[Required]
public int? FabricOptionSelected { get; set; }
public List<SelectListItem> FabricOptions { get; private set; }
我的(精简版)控制器看起来像这样:
model.FabricOptions.AddRange(product.Options
.Where(a=>a.ProductOptionCategory == Domain.Products.ProductOptionCategory.Fabric)
.ToSelectList( m => m.Name, m => m.Id.ToString(), "-- Select --"));
我的(精简)视图如下:
@if (Model.FabricOptions.Count > 1)
{
<div class="row form-group">
<div class="col-xs-2 control-label">Fabric</div>
<div class="col-xs-4">@Html.DropDownListFor(m => m.FabricOptionSelected, Model.FabricOptions, new { @class = "form-control" })</div>
<div class="col-xs-6">@Html.ValidationMessageFor(m => m.FabricOptionSelected)</div>
</div>
}
我在我的bundle配置中有"~/Scripts/jquery.validate.js"answers"~/SScripts/jquery.validate.uno唐突.js",web.config有:
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
在appsettings部分。
Chrome控制台没有显示任何错误,并且在被触发的页面下方有一个带有Required属性的文本框。
ToSelectList是一种扩展方法:
public static List<SelectListItem> ToSelectList<T>
(this IEnumerable<T> enumerable,
Func<T, string> text,
Func<T, string> value,
string defaultOption)
{
var items = enumerable.Select(f => new SelectListItem() { Text = text(f), Value = value(f) }).ToList();
items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" });
return items;
}
无法弄清楚为什么视图中的客户端验证没有为下拉列表启动。我想我错过了一些显而易见的东西,但我真的可以把手放在这个上面。
确保.ToSelectList
(这是您添加的扩展吗?)将默认的-- Select --
值设置为null
。将其设置为可为null的类型是一个良好的开端,但它需要为null才能起作用。
您的扩展方法正在插入一个"默认"选项,该选项具有对int
有效的value="-1"
,因此不会出现错误。你可以使用MVC 中已有的方法来实现你想要的
型号
[Required]
public int? FabricOptionSelected { get; set; }
public SelectList FabricOptions { get; set; }
控制器
var option = product.Options.Where(a=>a.ProductOptionCategory == Domain.Products.ProductOptionCategory.Fabric);
model.FabricOptions = new SelectList(options, "ID", "Name");
查看
@Html.DropDownListFor(m => m.FabricOptionSelected, Model.FabricOptions, "-- Select --", new { @class = "form-control" })
第三个参数将<select>
的第一个选项呈现为<option value>--Select--</option>
,即没有值,因此如果选择该值,则int? FabricOptionSelected
将为null
,因此由于[Required]
属性