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;
    } 

无法弄清楚为什么视图中的客户端验证没有为下拉列表启动。我想我错过了一些显而易见的东西,但我真的可以把手放在这个上面。

MVC 4下拉验证

确保.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]属性

而无法验证