为什么SelectList SelectedValue适用于HttpGet而不适用于HttpPost?

时间:2011-05-05 05:47:36

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

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

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

我在这里缺少什么?

型号:

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);
}

2 个答案:

答案 0 :(得分:3)

这是因为HTML帮助程序在呈现值时始终在模型中的值之前使用请求中的值。这基本上意味着如果要在POST操作中修改某个值,则需要先将其从模型状态中删除:

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

或帮助程序将忽略您手动设置的值并使用用户发布的值。

答案 1 :(得分:2)

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

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

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

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