在asp.net mvc(在我的情况下为v5)中,当您将模型发布回控制器,然后使用除了回发的模型之外的模型呈现视图 , Html.DropDownListFor将根据发回的模型中的数据选择所选项目,而不是传递给视图的模型。
为什么会这样?
这是一个例子。当您在第一个下拉列表中选择一个新项目时,表单会回发,如果第一个下拉列表选择了id = 2,那么selectedId2将被更改,第二个下拉列表应呈现,并选择第二个项目。然而事实并非如此。虽然视图中的Model对象具有新的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();
答案 0 :(得分:1)
如果使用适当的SelectList
构造函数,则可以指定所选值:
SelectList Constructor (IEnumerable, String, String, Object)
最后一个参数是所选项目,它必须是IEnumerable
的一个对象。
您正在使用此构造函数,但指定1
作为值。它应该类似于items1[0]