ASP.NET MVC SelectList在AJAX Post之后错误选择了项目

时间:2011-08-31 09:14:55

标签: asp.net-mvc ajax

使用SelectList时,ASP.NET MVC中的HtmlDropDownList存在一些问题。

我的问题是,我有一个包含视频剪辑记录的数据库,每个记录都有一个名为Type的属性,它是Embedded或Youtube。

然后我在局部视图中将这些显示为可编辑记录。这很好,在初始页面加载时,所有下拉列表都会显示每条记录的正确值。

当我通过编辑并在该行上单击“保存”来提交对记录的更改时,它会提交一个AJAX表单(使用Ajax.BeginForm),它会再次使用整个部分视图更新整个面板 - 这应该反映更改因为它重新抓取了数据库中的所有内容。

但是,当页面重新加载/更新时,所有下拉列表都会恢复到列表中的第一个项目作为默认选择值...我可以在数据库中验证值是否仍然是应有的(即它们都不会改为第一个值),而我还可以通过断点确认在视图显示之前,所有值都正确地通过

任何人都可以对此有所了解吗?

我正在显示下拉列表:

<%=Html.DropDownList("Type", "Embedded,Youtube".ToSelectList(item.Type), new { style = "width: 100px;"})%>

“ToSelectList”只是一个从逗号分隔字符串创建选择列表的扩展方法,参数是要用作选定值的值。

-

问题是,我使用“Type”作为DropDownList的名称,因此所有下拉列表都具有相同的ID字段,这意味着它们都采用相同的值。相反,我将它们更改为“{item.ID} .Type”,然后在我的控制器中,我只是将我的UpdateModel语句的前缀指定为“{id}。”。

var prefix = id.HasValue ? id.Value + "." : "";
UpdateModel(item, prefix, null, new[] { "Featured", "X-Requested-With" });

2 个答案:

答案 0 :(得分:0)

在为此页面提供服务的控制器操作中,您需要通过从数据库中读取值来指定值Type

ViewData["Type"] = ...

因为现在我觉得甚至提到ViewData都很脏,当然正确的方法是使用视图模型和强类型帮助器:

<%= Html.DropDownList(x => x.Type, Model.Types, new { style = "width: 100px;" }) %>

然后在控制器操作中,只需将控制器操作中Type属性的值指定为正确的值。

答案 1 :(得分:0)

问题是,我使用“Type”作为DropDownList的名称,因此所有下拉列表都具有相同的ID字段,这意味着它们都采用相同的值。相反,我将它们更改为“{item.ID} .Type”,然后在我的控制器中,我只是将我的UpdateModel语句的前缀指定为“{id}。”。

var prefix = id.HasValue ? id.Value + "." : "";
UpdateModel(item, prefix, null, new[] { "Featured", "X-Requested-With" });