我尝试搜索,没有找到任何解决问题的东西。我在Razor视图中有一个DropDownList,它不会显示在SelectList中标记为Selected的项目。这是填写列表的控制器代码:
var statuses = new SelectList(db.OrderStatuses,"ID","Name",order.Status.ID.ToString()); ViewBag.Statuses = statuses; return View(vm);
这是查看代码:
<div class="display-label"> Order Status</div> <div class="editor-field"> @Html.DropDownListFor(model => model.StatusID,(SelectList)ViewBag.Statuses) @Html.ValidationMessageFor(model => model.StatusID) </div>
我走过它,即使在视图中它具有正确的SelectedValue,但是DDL始终显示列表中的第一个项目,而不管选择的值如何。任何人都可以指出我做错了什么来让DDL默认为SelectValue?
解决方法
SelectList构造函数(希望能够传递所选值id)的最后一个参数被忽略,因为DropDownListFor Helper使用您作为第一个参数传递的lambda表达式,并使用特定属性的值。
所以这是丑陋的方法:
模型:
public class MyModel { public int StatusID { get; set; } }
控制器:
public class HomeController : Controller { public ActionResult Index() { // TODO: obvIoUsly this comes from your DB,// but I hate showing code on SO that people are // not able to compile and play with because it has // gazzilion of external dependencies var statuses = new SelectList( new[] { new { ID = 1,Name = "status 1" },new { ID = 2,Name = "status 2" },new { ID = 3,Name = "status 3" },new { ID = 4,Name = "status 4" },},"Name" ); ViewBag.Statuses = statuses; var model = new MyModel(); model.StatusID = 3; // preselect the element with ID=3 in the list return View(model); } }
视图:
@model MyModel ... @Html.DropDownListFor(model => model.StatusID,(SelectList)ViewBag.Statuses)
这是正确的方式,使用真实的视图模型:
模型
public class MyModel { public int StatusID { get; set; } public IEnumerable<SelectListItem> Statuses { get; set; } }
控制器:
public class HomeController : Controller { public ActionResult Index() { // TODO: obvIoUsly this comes from your DB,"Name" ); var model = new MyModel(); model.Statuses = statuses; model.StatusID = 3; // preselect the element with ID=3 in the list return View(model); } }
视图:
@model MyModel ... @Html.DropDownListFor(model => model.StatusID,Model.Statuses)