【发布时间】:2014-06-24 12:57:52
【问题描述】:
在 asp.net mvc(在我的例子中是 v5)中,当您将模型回传到控制器,然后使用不同于回传模型的模型渲染视图,然后Html.DropDownListFor 将根据回传的模型中的数据而不是传递给视图的模型来选择所选项目。
这是为什么?
这是一个例子。当您在第一个下拉列表中选择一个新项目时,表单会回发,如果第一个下拉列表选择了 id=2,则 selectedId2 会更改,并且第二个下拉列表应该呈现选择的第二个项目.然而事实并非如此。虽然视图中的模型对象确实具有新的 selectedId2 = 2 值,但底层的 DropDownListFor 从 ViewState.ModelState 对象而不是 ViewState.Model 获取选定值。怎样才能让 DropDownListFor 仅基于传递给视图的模型进行渲染?
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
var defaultModel = getModel();
return View(defaultModel);
}
[HttpPost]
public ActionResult Index(Model1 postedModel)
{
var defaultModel = getModel();
if (postedModel.selectedId1 == 2)
{
defaultModel.selectedId1 = 2;
defaultModel.selectedId2 = 2;
}
return View(defaultModel);
}
private Model1 getModel()
{
var items1 = new[]
{
new
{
Name = "Item 1-1",
Id = "1"
},
new
{
Name = "Item 1-2",
Id = "2"
}
};
var items2 = new[]
{
new
{
Name = "Item 1-1",
Id = "1"
},
new
{
Name = "Item 2-2",
Id = "2"
}
};
return new Model1
{
selectedId1 = 1,
selectedId2 = 1,
SelectList1 = new SelectList(items1, "Id", "Name", 1),
SelectList2 = new SelectList(items2, "Id", "Name", 1)
};
}
}
视图模型:
public class Model1
{
public SelectList SelectList1 { get; set; }
public SelectList SelectList2 { get; set; }
public int selectedId1 { get; set; }
public int selectedId2 { get; set; }
}
观点:
@model Model1
@using (Html.BeginForm(FormMethod.Post))
{
<div>
@Html.DropDownListFor(m => m.selectedId1, Model.SelectList1, new { title = "Select 1", onchange = "this.form.submit();" })
@Html.DropDownListFor(m => m.selectedId2, Model.SelectList2, new { title = "Select 2", onchange = "this.form.submit();" })
</div>
}
编辑:我找到的一个解决方案: 在执行 View() 之前添加这一行会清除发布的模型,以便 DropDownListFor 助手使用传递给视图的模型:
ViewData.ModelState.Clear();
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-5