【问题标题】:Why does SelectList SelectedValue work on HttpGet but not on HttpPost?为什么 SelectList SelectedValue 对 HttpGet 有效,但对 HttpPost 无效?
【发布时间】:2011-05-05 05:47:36
【问题描述】:

使用 MVC3 我发现设置 SelectList 的选定值可以正确呈现 HttpGet 上的视图,但无法在 HttpPost 上正确呈现。在将模型转发到 HttpPost 上的视图之前,我已经检查了它们并且它们正在正确更新,只是视图似乎没有正确呈现所选标签。

在 HttpPost 上,<select> 在任何编辑之后但在提交表单之前完全呈现。 HttpPost方法中的m.SelectedWidgetId = 2;被执行,更新模型,但不反映在View中。

我在这里错过了什么?

型号:

public class WidgetModel
{
    private Widget[] Widgets {
        get
        {
            return new Widget[] { 
                new Widget { Id=1, Name="Item 1" },
                new Widget { Id=2, Name="Item 2" },
                new Widget { Id=3, Name="Item 3" }
            };
        }
    }
    public SelectList WidgetList
    {
        get
        {
            return new SelectList(Widgets.ToList(), "Id", "Name", SelectedWidgetId);
        }
    }
    public int SelectedWidgetId { get; set; }
}

查看:

@model thisProject.Models.WidgetModel

@using (Html.BeginForm())
{
    @Html.DropDownListFor(m => m.SelectedWidgetId, Model.WidgetList, "Select...");      
    <input type='submit' />                                                                                    
}

控制器方法;

public ActionResult Widget()
{
    var m = new WidgetModel();
    m.SelectedWidgetId = 1;
    return View(m);
}
[HttpPost]
public ActionResult Widget(WidgetModel m)
{
    m.SelectedWidgetId = 2;
    return View(m);
}

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 html-select selectlist


    【解决方案1】:

    这是因为 HTML 助手在渲染值时总是先使用请求中的值,然后再使用模型中的值。这基本上意味着如果您想修改 POST 操作中的某些值,您需要先将其从模型状态中删除:

    [HttpPost]
    public ActionResult Widget(WidgetModel m)
    {
        ModelState.Remove("SelectedWidgetId");
        m.SelectedWidgetId = 2;
        return View(m);
    }
    

    否则助手将简单地忽略您手动设置的值并使用用户发布的值。

    【讨论】:

    • @Darin - 你是怎么变得这么聪明的? :)
    【解决方案2】:

    在 asp.net mvc 中,当我们使用强类型帮助器时,selectList 的 selectedvalue 被创建下拉列表的属性的值覆盖,即

    <%:Html.DropDownListFor(x=>x.SelectedWidgetID, ---,----)%>
    

    在这种情况下,Model.selectedwidgetID 的值将覆盖在

    中设置的值
    new SelectList(Widgets.ToList(), "Id", "Name", SelectedWidgetId);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 2019-11-01
      • 2023-03-09
      • 1970-01-01
      • 2017-08-31
      • 2022-01-12
      相关资源
      最近更新 更多