HTML.DropDownList不尊重预选值。

3
我希望使用Html.DropDownList(string name, IEnumerable SelectList, Object htmlAttributes)函数为我呈现一个带有预选值的下拉列表,该下拉列表在我的视图模型对象中。因此,我编写了以下代码:
<%= Html.DropDownList("aName", mySelectList, new { }) %>

这将呈现没有预选值的选择列表。

我发现的一个解决方法是将SelectList作为ViewData传递,并执行以下操作:

在控制器中:

ViewData["TimeZones"] = mySelectList;

在视图中:

<%= Html.DropDownList("TimeZones", null, new { }) %> 

通过这种方式,选择列表将呈现预选值,但是我不想被强制将选择列表作为视图数据传递。我做错了什么?非常感谢您的帮助。


你如何创建mySelectList?不需要使用new { } - LukLed
3个回答

3
您可以简单地执行以下操作(它有效):
<%: Html.DropDownList("DropdownName", new SelectList(ListItems, "Value", "Text", selectedItem), htmlAttributes)%>

如果这样不起作用,请告诉我。

谢天谢地,这也适用于Razor VE。我能够将List<>传递给ListItems集合...完美运行。 - hanzolo

1

自动绑定所选项目

另一种方法是自动绑定所选项目,并将项目列表作为参数传递给DropDownList助手方法。

在控制器中,您要做的事情与以前完全相同,只是不要将任何项目的Selected属性设置为true。然后,您还必须将要选择的项目的值放入视图模型中。

var model = new IndexViewModel()
            {
                ListItems = items,
                SelectedItem = 2
            };

最后在视图中,您使用了可接受selectList参数的重载:

<%= Html.DropDownList("SelectedItem", Model.ListItems) %>

HTML 渲染的唯一区别在于,第一种方法中 HTML 选择元素的名称为 ListItems,而第二种方法中为 SelectedItem
如果您正在创建自己的列表,则这些方法是可以接受的,但如果您从外部方法(例如来自 DB 存储库)接收选项列表,则它们不是最佳解决方案。
请查看此 link

0

我知道这是一个旧帖子,但我在MVC5中遇到了类似的问题。解决方案很简单,但我花了一段时间才解决,所以我想分享一下。

VS自动生成视图中的DropDownLists如下:

@Html.DropDownList("EpisodeTypeId", null, htmlAttributes: new { @class = "form-control" })

在控制器中,VS会针对创建和编辑自动生成不同的ViewBag代码。
以下是创建操作的代码:
ViewBag.EpisodeTypeId = new SelectList(db.EpisodeTypes, "Id", "Name");

并且从编辑中:

ViewBag.EpisodeTypeId = new SelectList(db.EpisodeTypes, "Id", "Name", episode.EpisodeTypeId);

第四个参数对于编辑非常重要,这一点可以预料。如果您省略它,则该记录的数据库值将不会在下拉列表中被预选。

VS自动生成的代码是正确的,但如果您稍后手动添加字段,很容易忽略这一点。


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