【问题标题】:.NET MVC MultiSelectList and selected values.NET MVC MultiSelectList 和选定的值
【发布时间】:2010-03-03 19:48:38
【问题描述】:

我正在尝试为 MultiSelectList 设置选定值,但页面未显示任何选定值。我已经尝试了所有可行的方法来做到这一点,但仍然得到相同的结果。我目前正在尝试通过构造函数传递选定对象的列表。让我明白的是,当我检查 MultiSelectList 对象时, selectedvalues 属性包含我使用构造函数传递给它的项目,但它仍然不显示。

我注意到很多人都遇到了同样的问题,但我还没有看到对我有用的答案。我尝试遍历列表并将 selected 属性设置为 true,我尝试从头开始创建多选列表并设置每个单独的项目 selected 属性,并且我尝试使用构造函数。这些都没有奏效。我还发现了一个建议,即 MultiSelectList 属性不能与控件(我尝试过)命名相同并且不起作用。为什么使用此框架创建具有选定值的下拉列表如此困难?我错过了什么吗?

<label for="StatesOfPractice">States of Practice:</label>
                    <br />
                    <%= Html.ListBox("StatesOfPractice", Model.StatesOfPracticeList)%>
                    <br />
                    <%= Html.ValidationMessage("StatesOfPractice")%>

编辑 1

当我实例化 MultiSelectList 时,它似乎正在发生。如果我检查视图中的对象并打开结果视图,我可以看到当我知道应该选择“阿拉斯加”时,它没有被选中。

http://imgur.com/eTIdH.jpg

我是这样实例化的。

new MultiSelectList(List<GenericDataContract>, "Code", "Description", List<GenericDataContract>);

GenericDataContract 只是一个具有两个属性的类,代码和描述。第一个 List 是所有州,第二个 List 是我选择的州。

【问题讨论】:

    标签: asp.net-mvc multi-select selected


    【解决方案1】:

    Grrrrrr,我找到了。显然,所选项目只能是字符串列表。一旦我修改了我的代码以传递它,它就会选择这些值。

    【讨论】:

    • 我已经为此苦苦挣扎了一个多小时,直到找到您的问题。我认为这不是预期的行为。修复它有多难?
    【解决方案2】:

    好的,这个真的让我很困惑,但我想我已经弄明白了。

    MultiSelectList 显示并选择默认值的问题是我使用@Html.DropDownListFor(...) 来显示多选列表而不是@Html.ListBoxFor(...)。令人困惑的是,DropDownListFor 将显示一个多选列表,如果你指定 HTML 属性来强制它这样做,但默认值 不会工作,因为它只是有意的有一个默认值 - 因此以下将选择任何默认值:

    List<string> myStrings;
    myStrings = new List<string>();
    myStrings.Add("aaa");
    myStrings.Add("bbb");
    myStrings.Add("ccc");
    
    ViewData["MyStringsDropdown"] = new MultiSelectList(
        myStrings.Select(abc => new { StringId = abc, Title = abc + "Title" }),
        "StringId",
        "Title",
        myStrings.Where(str => str == "aaa" || str == "ccc").ToList()
    );
    
    ...
    
    @Html.DropDownListFor(model => model.MyStrings, (MultiSelectList)ViewData["MyStringsDropdown"], new { size = "10", multiple = "multiple" })
    

    但是,以下显示默认选择的“aaa”和“ccc”:

    @Html.ListBoxFor(model => model.MyStrings, (MultiSelectList)ViewData["MyStringsDropdown"], new { size = "10", multiple = "multiple" })
    

    但这才是真正的关键; ASP.NET 有时似乎 cache 是控件的类型,因此您可以将 DropDownListFor 替换为 ListBoxFor 并且它仍然不会预先选择任何默认值 直到您重新启动 IIS工作进程。我觉得这很奇怪,它让我很困惑。

    【讨论】:

      【解决方案3】:

      我相信它会从模型中提取选定的项目,而不是从项目列表中。确保您的 StatesOfPractice 模型属性填充了您要选择的项目。也就是说,StatesOfPracticeList 模型属性提供了用于填充列表的项目集。模型属性StatesOfPractice 将成为表单发布时选定属性值的集合,它还应包含呈现视图时的默认选定值。在后台,它使用 HtmlHelper GetModelStateValue 方法来查找任何选择列表的选定值。我认为这样做是为了在出现验证错误并且使用模型状态错误重新呈现表单时更容易维护所选值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-07
        • 2015-06-21
        • 1970-01-01
        • 2017-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多