下拉列表在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");