下拉列表在MVC3 Razor中设置选定的值

这是我的模型:

public class NewsCategoriesModel { public int NewsCategoriesID { get; set; } public string NewsCategoriesName { get; set; } } 

我的控制器:

 public ActionResult NewsEdit(int ID, dms_New dsn) { dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault(); var categories = (from b in dc.dms_NewsCategories select b).ToList(); var selectedValue = dsn.NewsCategoriesID; SelectList ListCategories = new SelectList(categories, "NewsCategoriesID", "NewsCategoriesName",selectedValue); // ViewBag.NewsCategoriesID = new SelectList(categories as IEnumerable<dms_NewsCategory>, "NewsCategoriesID", "NewsCategoriesName", dsn.NewsCategoriesID); ViewBag.NewsCategoriesID = ListCategories; return View(dsn); } 

然后我的看法:

 @Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID) 

当我运行, DropDownList不会select我设置的值..它总是select第一个选项。

你应该使用视图模型,并忘记关于ViewBag想法,如果它不存在。 你会看到事情变得容易多了。 所以定义一个视图模型:

 public class MyViewModel { public int SelectedCategoryId { get; set; } public IEnumerable<SelectListItem> Categories { get; set; } } 

然后从控制器填充这个视图模型:

 public ActionResult NewsEdit(int ID, dms_New dsn) { var dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault(); var categories = (from b in dc.dms_NewsCategories select b).ToList(); var model = new MyViewModel { SelectedCategoryId = dsn.NewsCategoriesID, Categories = categories.Select(x => new SelectListItem { Value = x.NewsCategoriesID.ToString(), Text = x.NewsCategoriesName }) }; return View(model); } 

最后在你的视图中使用强types的DropDownListFor助手:

 @model MyViewModel @Html.DropDownListFor( x => x.SelectedCategoryId, Model.Categories ) 

以防万一有人来这个问题,这是我怎么做,请忘记库对象,我使用的库模式,您可以使用您的对象上下文来检索实体。 而且也不注意我的实体名称,我的实体typesAction与MVC Action没有任何关系。

控制器:

 ViewBag.ActionStatusId = new SelectList(repository.GetAll<ActionStatus>(), "ActionStatusId", "Name", myAction.ActionStatusId); 

请注意,SelectList构造函数的最后一个variables是选定的值(object selectedValue)

那么这是我的看法来渲染它:

 <div class="editor-label"> @Html.LabelFor(model => model.ActionStatusId, "ActionStatus") </div> <div class="editor-field"> @Html.DropDownList("ActionStatusId") @Html.ValidationMessageFor(model => model.ActionStatusId) </div> 

我觉得这很简单,我希望这有助于! 🙂

那么它在控制器中非常简单,你有这样的东西:

– 控制器

 ViewBag.Profile_Id = new SelectList(db.Profiles, "Id", "Name", model.Profile_Id); 

– 查看(选项A)

 @Html.DropDownList("Profile_Id") 

– 查看(选项B) – >发送空值到列表

 @Html.DropDownList("Profile_Id", null, "-- Choose --", new { @class = "input-large" }) 

我想把正确的答案放在这里,以防其他人像我一样有这个问题。 如果你讨厌ViewBag,那么不要使用它,但是问题中的代码真正的问题是,同样的名字被用于模型属性和select列表,正如@RickAndMSFT指出的那样

只需更改DropDownList控件的名称即可解决问题,如下所示:

 @Html.DropDownList("NewsCategoriesSelection", (SelectList)ViewBag.NewsCategoriesID) 

它与使用ViewBag或不使用ViewBag没有任何关系,因为您可以与控件进行名称冲突。

将下面的行更换为新的更新的工作代码:

 @Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID) 

现在执行新的更新的工作代码

 @Html.DropDownListFor(model => model.NewsCategoriesID, ViewBag.NewsCategoriesID as List<SelectListItem>, new {name = "NewsCategoriesID", id = "NewsCategoriesID" }) 

我钻了下来列表的形成,而不是使用@Html.DropDownList() 。 如果您必须在运行时在razor而不是控制器中设置下拉列表的值,这非常有用:

 <select id="NewsCategoriesID" name="NewsCategoriesID"> @foreach (SelectListItem option in ViewBag.NewsCategoriesID) { <option value="@option.Value" @(option.Value == ViewBag.ValueToSet ? "selected='selected'" : "")>@option.Text</option> } </select> 

我更喜欢DropDownList助手的lambda表单 – 请参阅MVC 3布局页面,剃刀模板和DropdownList

如果你想使用SelectList,那么我认为这个bug报告可能会有帮助 – http://aspnet.codeplex.com/workitem/4932

代码波纹pipe, 得到 ,去

控制器:

 int DefaultId = 1; ViewBag.Person = db.XXXX .ToList() .Select(x => new SelectListItem { Value = x.Id.ToString(), Text = x.Name, Selected = (x.Id == DefaultId) }); 

视图:

 @Html.DropDownList("Person") 

注意:ViewBag。 Person和@ Html.DropDownList(“ Person ”)的名字应该和view模型一样

要selectIT部门,从tblDepartment表加载部门时,请使用以下重载SelectList类的构造函数。 请注意,我们为selectedValueparameter passing了1的值。

 ViewBag.Departments = new SelectList(db.Departments, "Id", "Name", "1");