关于如何通过ViewBag执行此操作,我没有真正看到任何答案。 (我知道我们都讨厌ViewBag,我应该使用ViewModel。不过我的问题,我需要知道如何在不设置ViewModel的情况下完成它。)
这是我的控制器设置为页面的GET请求:
var states = Ctx.States.ToList()
.Select(state => new SelectListItem
{
Text = state.Name,
Value = state.Name
}).OrderBy(x => x.Text).ToList();
ViewBag.SelectedStateOne = new SelectList(
states,
"Text",
"Value",
user.Applicant.FinancialAidInformation.FinancialAidContacts
.ElementAtOrDefault(0).Address.State.Name);
ViewBag.SelectedStateTwo = states;
我正在以两种不同的方式设置viewbag。两种方式似乎都正确地绑定下拉,并正确地回发所选值。但是当我回到页面时,默认选择不是数据库中的值。
在我的观点中:
@Html.DropDownList("SelectedStateOne", null, new { @class = "form-control" })
@Html.DropDownList("SelectedStateTwo", null, new { @class = "form-control" })
相同的下降,但显示两者以避免混淆我猜。我认为我使用SelectedStateOne viewbag数据做的是设置默认值的正确方法,但没有骰子。我哪里错了?
答案 0 :(得分:5)
如果您想指定默认值,使用SelectList
是更简单的方法,所以让我们使用它。
首先,您的原始查询是不必要的。可以使用SelectList
构建IEnumerable<T>
,这意味着您不必首先投射到SelectListItem
。所以这个:
var states = Ctx.States.ToList()
.Select(state => new SelectListItem
{
Text = state.Name,
Value = state.Name
}).OrderBy(x => x.Text).ToList();
变为:
var states = Ctx.States.OrderBy(x => x.Name).ToList();
现在,您只需使用ViewBag
属性将列表分配给Name
:
// Removed the long type name for clarity
ViewBag.SelectedStateOne = new SelectList(states, "Name", "Name", YourSelected.State.Name);
视图中的调用保持不变:
@Html.DropDownList("SelectedStateOne", null, new { @class = "form-control" })
如果仍然没有选择正确的项目,请仔细检查以确保YourSelected.State.Name
列表中存在states
。