【问题标题】:ASP.NET MVC SelectList Selected Item Wrong After AJAX PostAJAX 发布后 ASP.NET MVC SelectList 选定项错误
【发布时间】:2012-11-27 19:06:45
【问题描述】:

在使用 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" });

【问题讨论】:

    标签: asp.net-mvc ajax


    【解决方案1】:

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

    ViewData["Type"] = ...
    

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

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

    然后在您的控制器操作中,只需将控制器操作中的 Type 属性的值分配给正确的值。

    【讨论】:

    • 每条记录的 item.Type 中已经有一个值。我将 IEnumerable 传递给从数据库填充的视图。
    • @Tom Glenn,这个值在哪里?它不应该在item.Type 中,因为在您的弱类型助手中,您使用"Type" 作为名称。如果您使用带有编辑器模板的强类型版本,您将不会遇到此类问题。
    • 据我所知,“类型”只是指下拉列表的名称(即
    • 只是为了进一步澄清。我的原始方法适用于初始页面加载。所有下拉列表均已正确填充/选择。仅当我保存更改并通过 Ajax 重新加载 PartialView 时才会出现此问题(即使我可以确认数据仍在正确提取)。
    • 我现在已经解决了这个问题。这是因为我没有为每条记录指定唯一的前缀,所以它们都取第一项的值,因为它们的 ID 相同。解决方案已添加到原始帖子中。
    【解决方案2】:

    解决方案

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      相关资源
      最近更新 更多