.NET MVC MultiSelectList和选定的值

8
我试图设置MultiSelectList的选中值,但页面没有显示任何选中内容。我已经尝试了各种实用的方法,但结果始终不变。目前,我尝试通过构造函数传递选定对象的列表。令我困惑的是,当我检查MultiSelectList对象时,selectedvalues属性包含我使用构造函数传递的项目,但仍未显示在页面上。
我注意到很多人都遇到了同样的问题,但我还没有看到解决我的答案。我尝试迭代列表并将selected属性设置为true,我尝试从头开始创建Multiselectlist并设置每个单独项目的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)是一个只有两个属性Code和Description的类。第一个列表包含所有状态,第二个列表则是我选择的状态。

3个回答

9

我找到了问题所在。显然,所选项目只能是字符串列表。一旦我修改了代码以便传递这个参数,它就可以选择值了。


我已经苦苦挣扎了一个多小时,直到找到你的问题。我认为这不可能是预期的行为。修复它有多难呢? - Bardo

4

好的,这个确实让我感到困惑,但我想我已经弄清楚了。

我遇到的问题是无法在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有时会似乎缓存控件的类型,所以您可以将DropDownListFor 替换为 ListBoxFor,但它仍然不会预选任何默认值直到重新启动IIS工作进程。我觉得这非常奇怪,让我困扰了一段时间。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接