使用 MVC3,我发现设置 SelectList 的选定值可以正确呈现 HttpGet 上的 View ,但无法在 HttpPost 上正确呈现。在将模型转发到 HttpPost 上的 View 之前,我已经检查了模型,并且它们正在正确更新,只是 View 似乎没有正确渲染所选标签。
在 HttpPost 上,<select>
完全按照任何编辑后但提交表单之前的状态呈现。 m.SelectedWidgetId = 2;
在HttpPost方法执行时,更新了model,但是没有体现在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' />
}
Controller 方法;
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);
}
最佳答案
发生这种情况是因为 HTML 帮助程序在渲染值时始终先使用请求中的值,然后再使用模型中的值。这基本上意味着,如果您想修改 POST 操作中的某些值,您需要首先将其从模型状态中删除:
[HttpPost]
public ActionResult Widget(WidgetModel m)
{
ModelState.Remove("SelectedWidgetId");
m.SelectedWidgetId = 2;
return View(m);
}
或者助手将忽略您手动设置的值并使用用户发布的值。
关于asp.net-mvc - 为什么 SelectList SelectedValue 在 HttpGet 上有效,但在 HttpPost 上无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5893185/