学习下拉列表,我正在尝试添加一个RSVP创建页面,像Scott Gu的博客中所述,在Html.DropDownListFor中列出可用的晚餐。
我可以让下拉列表显示出来,但我无法让其预先选择我想要的值(“Sample Dinner 2”)。我使用一个初始化器在数据库中种了一些晚餐对象。该数据库是使用EF“先代码”方法的sql ce 4.抱歉我知道这是一个常见的问题,不过老实说我已经花了相当长的时间,但还是无法使其工作:
ViewModel
public class RSVPViewModel
{
public SelectList DinnersList { get; set; }
public RSVP Rsvp { get; set; }
public string SelectedItem { get; set; }
}
控制器
//
//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>
所以在页面加载时不会预先选定下拉列表中的"value"为"Sample Dinner 2"的值。当我进行选择并点击提交时,列表显示正常并设置了正确的DinnerID。
也尝试了这个:
@Html.DropDownListFor(x => x.SelectedItem, Model.DinnersList)
这个操作可以从列表中进行预选,但是并没有绑定(或设置)Rsvp.DinnerID。
@Html.DropDownList("DinnersList")
我希望保持mvc3的框架,因此想要使用ViewModel方法来实现强类型(不使用ViewData),最好使用Html.DropDownListFor(而非Html.DropDownList)。在这种情况下,Viewbag似乎是不必要的。
谢谢!
Edit1:
我认为应该使用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。我认为这被称为绑定。
new SelectList(...)
生成的列表中是否有一个其 Selected 属性为 true 的项目? - StriplingWarrior