我确实没有看到任何关于如何通过 ViewBag 执行此操作的答案。 (我知道我们都讨厌 ViewBag,我应该使用 ViewModel。但这不是我的问题,我需要知道如何在不设置 ViewModel 的情况下做到这一点)。
这是我为页面的 GET 请求设置的 Controller :
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;
我用两种不同的方式设置 View 包。两种方法似乎都正确绑定(bind)了下拉列表,并正确回发了所选值。但是当我返回页面时,默认选择不是数据库中的值。
在我看来:
@Html.DropDownList("SelectedStateOne", null, new { @class = "form-control" })
@Html.DropDownList("SelectedStateTwo", null, new { @class = "form-control" })
相同的下拉菜单,但我想显示两者以避免混淆。我认为我对 SelectedStateOne viewbag 数据所做的事情是设置默认值的正确方法,但没有骰子。我哪里出错了?
最佳答案
当你想指定一个默认值时,使用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);
View 中的调用保持不变:
@Html.DropDownList("SelectedStateOne", null, new { @class = "form-control" })
如果仍然没有选择正确的项目,请仔细检查以确保 YourSelected.State.Name
存在于您的states
中列表。
关于c# - 无法让 asp.net MVC4 DropDownList() 具有预设值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21169234/