无法获得asp.net MVC4 DropDownList()以获得预设值

时间:2014-01-16 17:52:37

标签: c# asp.net asp.net-mvc asp.net-mvc-4

关于如何通过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数据做的是设置默认值的正确方法,但没有骰子。我哪里错了?

1 个答案:

答案 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