繁体   English   中英

MVC 4下拉验证

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM