在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();发布于 2014-06-24 13:12:20
如果使用适当的SelectList构造函数,则可以指定选定的值:
SelectList构造函数(IEnumerable、String、String、Object)
最后一个参数是选定的项,它必须是IEnumerable的一个对象。
您正在使用此构造函数,但将1指定为值。应该像items1[0]一样
https://stackoverflow.com/questions/24387263
复制相似问题