[英]MVC 4 Dropdown validation
好,这真让我发疯。 我有一个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>
}
我的捆绑包配置中包含“〜/ Scripts / jquery.validate.js”和“〜/ Scripts / jquery.validate.unobtrusive.js”,而web.config具有:
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
在“设置”部分中。
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才能使Required正常工作。
您的扩展方法正在插入一个“ default”选项,该选项的value="-1"
对int
有效,因此不会出现错误。 您可以使用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
int? FabricOptionSelected
将为null
,因此由于[Required]
属性而导致验证失败
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.