MVC 3 Dropdown使用ViewBag丢失选定值

时间:2011-04-28 08:53:44

标签: c# html asp.net-mvc-3

我遇到了下拉菜单和viewbag的问题。我在控制器中使用以下代码设置下拉列表:

        applicationGuid = new Guid(form["applicationList"]);

        var applications = _applicationRepository.List();

        ViewBag.applicationList = new SelectList(applications, "Id", "Name", applicationGuid);

并且在视图中,这完美地工作并返回先前选择的值(applicationGuid):

 @Html.DropDownList("applicationList", "")

现在我想使用以下代码,因为我想在下拉列表中添加一些属性:

 @Html.DropDownList("applicationList", ViewBag.applicationList as SelectList, "", new { rel = "0", @class = "required" }) 

但由于某种原因,未呈现所选的值(即使它被传递给视图,我可以看到selected =“true”对着ViewBag SelectList中的正确项目。)

上面的两个例子呈现为(这个具有selected =“selected”):

<select id="applicationList" name="applicationList"><option value=""></option><option selected="selected" value="2f666645-9b28-406f-bd9f-9ecc009346a6">app1</option><option value="898cbbb5-5dff-4378-b15a-9ecc00b8242f">app2</option></select>

和之类似(选择已经消失!!):

<select class="required" id="applicationList" name="applicationList" rel="0"><option value=""></option><option value="2f666645-9b28-406f-bd9f-9ecc009346a6">app1</option><option value="898cbbb5-5dff-4378-b15a-9ecc00b8242f">app2</option></select> 

任何人都可以解释我在这里做错了什么以及它为什么会失去选定值?我发现了很多关于视图数据项名称如何不能冲突的帖子,但是我已经用随机名称删除了这一点,似乎没有任何工作!这是MVC3中的一个问题吗?

2 个答案:

答案 0 :(得分:15)

问题似乎是当您将SelectList作为参数传递给Html.DropDownList()时,它不喜欢它与实际下拉列表同名。

我复制了您的代码并遇到了与您相同的问题。

但是一改变了

@Html.DropDownList("applicationList", ViewBag.applicationList as SelectList, "", new { rel = "0", @class = "required" })

@Html.DropDownList("applicationListX", ViewBag.applicationList as SelectList, "", new { rel = "0", @class = "required" })

它产生了工作输出:

<select class="required" id="applicationListX" name="applicationListX" rel="0"><option value=""></option>
<option selected="selected" value="2f666645-9b28-406f-bd9f-9ecc009346a6">app1</option>
<option value="898cbbb5-5dff-4378-b15a-9ecc00b8242f">app2</option>
</select>

我不知道为什么会这样,但是有你的解决方法。

答案 1 :(得分:0)

经过数天的乱搞,不想更改选择列表的名称(因为我不想在回发时破坏模型的自动绑定),this article末尾的替代解决方案显示我的方式。不要使用ViewBag。使用与模型字段名称相同的名称的ViewData,并且不要将其他任何内容传递给DropDownList,或者将null作为第二个参数传递,以防您想要HTML属性的第三个参数(我愿意)。