C# MVC4下拉验证

C# MVC4下拉验证,c#,jquery,asp.net-mvc-4,unobtrusive-validation,C#,Jquery,Asp.net Mvc 4,Unobtrusive Validation,好吧,这让我快发疯了。我有一个MVC4网站,它正在验证客户端上的文本框,但不是下拉列表 我的(精简版)模型如下所示: [Required] public int? FabricOptionSelected { get; set; } public List<SelectListItem> FabricOptions { get; private set; } model.FabricOptions.AddRange(product.Options .Where(a=>a.Pr

好吧,这让我快发疯了。我有一个MVC4网站,它正在验证客户端上的文本框,但不是下拉列表

我的(精简版)模型如下所示:

[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>
    }
我的(缩小)视图如下所示:

[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>
    }
@if(Model.fabrioptions.Count>1)
{
织物
@DropDownListFor(m=>m.FabricOptionSelected,Model.FabricOptions,new{@class=“form control”})
@Html.ValidationMessageFor(m=>m.FabricOptionSelected)
}
我的bundle配置中有“~/Scripts/jquery.validate.js”和“~/Scripts/jquery.validate.unobtrusive.js”,web.config有:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

在appsettings部分中

Chrome console没有显示任何错误,并且在正在激发的页面下方有一个带有必需属性的文本框

.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;
    } 
公共静态列表到选择列表
(这是一个可数可枚举的,
Func文本,
Func值,
字符串(默认选项)
{
var items=enumerable.Select(f=>newselectListItem(){Text=Text(f),Value=Value(f)}).ToList();
插入(0,新SelectListItem(){Text=defaultOption,Value=“-1”});
退货项目;
} 

无法理解为什么视图中的客户端验证没有触发下拉列表。我想我遗漏了一些明显的东西,但这一点确实可以用手来解决。

确保
.ToSelectList
(这是您添加的扩展吗?)将默认的
--选择--
值设置为
null
。将其设置为可空类型是一个良好的开端,但它需要为空才能正常工作。

确保
.ToSelectList
(这是您添加的扩展吗?)将默认的
--选择--
值设置为
null
。将其设置为可空类型是一个良好的开端,但它需要为空才能正常工作。

确保
.ToSelectList
(这是您添加的扩展吗?)将默认的
--选择--
值设置为
null
。将其设置为可空类型是一个良好的开端,但它需要为空才能正常工作。

确保
.ToSelectList
(这是您添加的扩展吗?)将默认的
--选择--
值设置为
null
。将其设置为可空类型是一个良好的开端,但它需要为空才能正常工作。

您的扩展方法是插入一个“默认”选项,该选项具有
值=“-1”
,该选项对
int
有效,因此不会出现错误。您可以使用MVC中已有的方法来实现所需

模型

控制器

var option = product.Options.Where(a=>a.ProductOptionCategory == Domain.Products.ProductOptionCategory.Fabric);
model.FabricOptions = new SelectList(options, "ID", "Name");
看法


第三个参数将
的第一个选项呈现为
--Select--
,即没有值,因此如果选择了该选项,
int?FabriOptions Selected
将为
null
,因此验证失败,因为
[必需]
属性

您的扩展方法是插入一个“默认”选项,该选项的值为
value=“-1”
,该选项对
int
有效,因此不会出现错误。您可以使用MVC中已有的方法来实现所需

模型

控制器

var option = product.Options.Where(a=>a.ProductOptionCategory == Domain.Products.ProductOptionCategory.Fabric);
model.FabricOptions = new SelectList(options, "ID", "Name");
看法


第三个参数将
的第一个选项呈现为
--Select--
,即没有值,因此如果选择了该选项,
int?FabriOptions Selected
将为
null
,因此验证失败,因为
[必需]
属性

您的扩展方法是插入一个“默认”选项,该选项的值为
value=“-1”
,该选项对
int
有效,因此不会出现错误。您可以使用MVC中已有的方法来实现所需

模型

控制器

var option = product.Options.Where(a=>a.ProductOptionCategory == Domain.Products.ProductOptionCategory.Fabric);
model.FabricOptions = new SelectList(options, "ID", "Name");
看法


第三个参数将
的第一个选项呈现为
--Select--
,即没有值,因此如果选择了该选项,
int?FabriOptions Selected
将为
null
,因此验证失败,因为
[必需]
属性

您的扩展方法是插入一个“默认”选项,该选项的值为
value=“-1”
,该选项对
int
有效,因此不会出现错误。您可以使用MVC中已有的方法来实现所需

模型

控制器

var option = product.Options.Where(a=>a.ProductOptionCategory == Domain.Products.ProductOptionCategory.Fabric);
model.FabricOptions = new SelectList(options, "ID", "Name");
看法



第三个参数将
的第一个选项呈现为
--Select--
,即没有值,因此如果选择了该选项,
int?FabriOptions selected
将为
null
,因此验证失败,因为
[必需]
属性

您在结构选项上选择了必需的属性,但它可以为null,因此如果他们没有选择任何内容,我认为它仍然有效。请尝试删除nullable,看看这是否会有所不同Hi Matt,谢谢您的回复。试过了-运气不好。
.toselect
是什么?您似乎没有呈现
null
选项,因此始终选择某个选项以使其有效,并且您永远不会收到错误消息。您好,Stephen,这是一个扩展方法。我已经更新了我的原始问题,以显示它不确定为什么您不只是使用默认的选择列表和帮助器来呈现选项标签(更容易),而是您的扩展方法添加了一个值为-1的“默认”选项。因为
-1
是一个int(不是空值),所以它是有效的,所以没有错误。您在结构选项上选择了必需的属性,但它可以为空,因此如果他们没有选择任何内容,我认为它仍然有效。请尝试删除nullable,看看这是否会有所不同Hi Matt,谢谢您的回复。试过了-运气不好。
.toselect
是什么?您似乎没有呈现
null
选项,因此始终选择某个选项以使其有效,并且您永远不会收到错误消息。您好,Stephen,这是一个扩展方法。我已经