了解下拉列表,我正在尝试为 nerddinner 添加一个 RSVP 创建页面,如 Scott Gu's blog使用 Html.DropDownList 列出可用的晚餐。
我可以填充下拉列表,但无法让下拉列表预先选择我想要的值(“ sample 晚餐 2”)。我使用初始化器在数据库中播种一些晚餐对象。该数据库是使用 EF '代码优先方法'的 sql ce 4。抱歉,我知道这是一个常见的问题,不想问,但老实说,我在这方面花了很多时间,但无法让它发挥作用:
查看型号
public class RSVPViewModel
{
public SelectList DinnersList { get; set; }
public RSVP Rsvp { get; set; }
public string SelectedItem { get; set; }
}
Controller
//
//GET: /RSVP/Create
public ActionResult Create()
{
RSVP rsvp = new RSVP();
string selected = "Sample Dinner 2";
var typeList = new SelectList(dbc.Dinners.ToList(), "DinnerID", "Title", selected);
var viewModel = new RSVPViewModel { DinnersList = typeList, Rsvp = rsvp, SelectedItem = selected };
return View("Create", viewModel);
}
查看
@Html.DropDownListFor(model => model.Rsvp.DinnerID, Model.DinnersList)
HTML 结果
<select data-val="true" data-val-number="The field DinnerID must be a number." data-val-required="The DinnerID field is required." id="Rsvp_DinnerID" name="Rsvp.DinnerID">
<option value="1">Sample Dinner 1</option>
<option value="2">Sample Dinner 2</option>
</select>
因此,在页面加载时不会预先选择值为“Sample Dinner 2”的下拉列表。当我做出选择并单击提交时,列表显示正常并设置了正确的 DinnerID。
也试试这个:
@Html.DropDownListFor(x => x.SelectedItem, Model.DinnersList)
但没有设置或绑定(bind)到 Rsvp.DinnerID。
这从列表中预选但不绑定(bind)(或设置 Rsvp.DinnerID)
@Html.DropDownList("DinnersList")
我想保留它 mvc3,所以想使用 ViewModel 方法(无 ViewData)实现强类型,最好使用 Html.DropDownListFor(不是 Html.DropDownList)。对于这种情况,Viewbag 似乎没有必要。
谢谢!
编辑1
认为我应该使用 selectListItems 的 selectList 我尝试了这种详细的方法:
RSVP rsvp = new RSVP();
string selected = "2";
List<SelectListItem> dinners = new List<SelectListItem>();
foreach (Dinner dinner in dbc.Dinners.ToList())
{
SelectListItem slDinner = new SelectListItem();
slDinner.Value = dinner.DinnerID.ToString();
slDinner.Text = dinner.Title;
slDinner.Selected = (slDinner.Value == selected);
dinners.Add(slDinner);
}
var dinnersList = new SelectList(dinners, "Value", "Text", selected);
var viewModel = new RSVPViewModel { DinnersList = dinnersList, Rsvp = rsvp, SelectedItem = selected };
然而仍然没有工作。我应该以某种方式使用 @Html.DropDownListFor.. 中的 ViewModel SelectedItem 属性吗?就像是 :
@Html.DropDownListFor(x => x.SelectedItem, Model.DinnersList)
但是如何获得一个选定的值来设置 Rsvp.DinnerID。我认为这叫做绑定(bind)。
最佳答案
看完here和 here ,终于明白HtmlDropDownlistFor是如何在下拉列表中自动选择正确的项目了根据您的型号 - 在 RSVP 中选择一个 DinnerID(dinner.dinnerID 的外键)将导致包含 Dinner.DinnerIDs 列表的下拉菜单预先选择该值。我认为 SelectList 或 ViewModel 中的 selectedValue 还不需要。
解决方案:
//
//GET: /RSVP/Create
public ActionResult Create()
{
//automatically preselects matching DinnerID in the Dinner dropdownlist
var rsvp = new RSVP {DinnerID = 2 };
var typeList = new SelectList(dbc.Dinners.ToList(), "DinnerID", "Title");
var viewModel = new RSVPViewModel { DinnersList = typeList, Rsvp = rsvp};
return View("Create", viewModel);
}
关于asp.net-mvc - asp.net mvc 3 预选 Html.DropDownListFor 不在 Nerd 晚餐中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4800447/