如何将ASP MVC表单下拉列表设置为空白但仅当基础值未初始化时?

haw*_*bsl 8 html javascript forms asp.net-mvc

我们有一个包含大量字段的普通ASP.NET MVC表单.第一个字段是最重要的,它是一个下拉列表.让我们说这是公司领域,它包含两个价值"可口可乐"和"百事可乐".

公司领域如下所示:

    <div class="editor-label">
       @Html.LabelFor(Function(model) model.Company)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(Function(model) model.Company, TryCast(ViewData("Companies"), SelectList), New With {Key .style = "blah blah;"})
        @Html.ValidationMessageFor(Function(model) model.Company)
    </div>
Run Code Online (Sandbox Code Playgroud)

因为重要的是这个选择是积极的,并且不仅仅是因为它首先按字母顺序排列在"可口可乐"上,我们首先要求该字段为空(验证数据注释会强制用户将某些内容放入其中).

这很容易用Javascript完成,如下所示:

        function InitialiseForm() {
            $('#Company').prop('selectedIndex', -1);
        }

        window.onload = InitialiseForm;
Run Code Online (Sandbox Code Playgroud)

但是,我们有一些情况,表单没有完全填空,而是在控制器中初始化公司字段,如下所示:

    modelObject.Company = "Coca Cola" 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们当然不希望Javascript执行并删除它.

在这种情况下,正常的解决方案是什么?

vor*_*olf 3

我的假设是正确的:如果初始值为空,则DropDownListFor不会生成属性。selected

对于空公司,它会生成以下 html:

<select id="Company" name="Company">
   <option value="1">Coca-Cola</option>
   <option value="2">Pepsi</option>
</select>
Run Code Online (Sandbox Code Playgroud)

与所选公司的html代码不同:

<select id="Company" name="Company">
   <option selected="selected" value="1">Coca-Cola</option>
   <option value="2">Pepsi</option>
</select>
Run Code Online (Sandbox Code Playgroud)

所以你可以使用这个 JavaScript 代码,它会起作用:

$(function () {
    if ($("#Company").find("option[selected]").length == 0) {
        $("#Company").prop('selectedIndex', -1);
    }
});
Run Code Online (Sandbox Code Playgroud)

另外,如果您的 jquery 版本早于 1.9.0,则option[selected]表达式可能无法正常工作。该错误在 1.9.0 中得到修复,但在早期版本中,“filter”、“children”和“is”等函数无法正常工作,而“find”和“has”则返回正确的结果。