为什么SelectList SelectedValue在HttpGet上工作,但不在HttpPost上工作?
问题描述:
使用MVC3我发现设置SelectList的选定值正确呈现HttpGet上的视图,但无法在HttpPost上正确呈现。我已经检查了模型,然后将它们转发到HttpPost上的视图,并且它们正在被正确更新,但似乎视图并未正确呈现所选标记。为什么SelectList SelectedValue在HttpGet上工作,但不在HttpPost上工作?
在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);
}
在asp.net MVC的SelectList的的SelectedValue
答
发生这种情况的原因是HTML帮助程序在呈现值时始终在模型中的值之前使用请求中的值。这基本上意味着,如果你想在POST操作修改一些值,你需要从模型状态首先除去它:
[HttpPost]
public ActionResult Widget(WidgetModel m)
{
ModelState.Remove("SelectedWidgetId");
m.SelectedWidgetId = 2;
return View(m);
}
或助手将简单地忽略手动设置的值,并使用一个由用户发布。
答
由其中当我们使用强类型的辅助即
<%:Html.DropDownListFor(x=>x.SelectedWidgetID, ---,----)%>
在Model.selectedwidgetID的这种情况下,价值被创建下拉菜单中的属性值覆盖将覆盖在
中设置的值
真棒,解决了我的问题,非常感谢。 – 2011-05-05 06:34:50
@Darin - 你是怎么变得如此聪明? :) – Sam 2011-11-06 00:01:58