asp.net mvc 3预先选择Html.DropDownList为不在书呆子晚餐工作

Jay*_*Jay 14 asp.net-mvc html.dropdownlistfor asp.net-mvc-3

了解下拉列表,我试图添加一个RSD创建页面为nerddinner,如Scott Gu的博客与Html.DropDownListFor列出可用的晚餐.

我可以填充下拉列表但我无法获得下拉菜单以预先选择我想要的值("示例晚餐2").我使用启动器在数据库中播种一些晚餐对象.数据库是使用EF'代码第一种方法'的sql ce 4.对不起,我知道这是常见的问题,讨厌问,但老实说已经花了相当长的时间,但不能让它工作:

视图模型

public class RSVPViewModel
{
    public SelectList DinnersList { get; set; }
    public RSVP Rsvp { get; set; }
    public string SelectedItem { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

调节器

    //
    //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);
    }
Run Code Online (Sandbox Code Playgroud)

视图

@Html.DropDownListFor(model => model.Rsvp.DinnerID, Model.DinnersList)
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

因此,当页面加载时,不会预先选择带有"Sample Dinner 2"值的下拉列表.列表显示正常,并在我做出选择时设置正确的DinnerID,然后单击"提交".

尝试这个:

@Html.DropDownListFor(x => x.SelectedItem, Model.DinnersList)
Run Code Online (Sandbox Code Playgroud)

但不设置或绑定到Rsvp.DinnerID.

这是从列表中预选但不绑定(或设置Rsvp.DinnerID)

@Html.DropDownList("DinnersList")
Run Code Online (Sandbox Code Playgroud)

我想保留它mvc3所以想要使用ViewModel方法实现强类型(没有ViewData),最好使用Html.DropDownListFor(不是Html.DropDownList).在这种情况下,查看似乎没有必要.

谢谢!

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 };
Run Code Online (Sandbox Code Playgroud)

但仍然没有工作.我应该在以下方面使用ViewModel SelectedItem属性:@ Html.DropDownListFor ..不知何故?就像是 :

@Html.DropDownListFor(x => x.SelectedItem, Model.DinnersList)
Run Code Online (Sandbox Code Playgroud)

但是如何获取选定的值来设置Rsvp.DinnerID.我认为这称为绑定.

Jay*_*Jay 12

这里这里阅读之后,我终于明白HtmlDropDownlistFor如何根据你的模型在下拉列表中自动选择正确的项目- 在RSVP中选择dinnerID(Dinner.dinnerID的外键)将导致下载包含Dinner.DinnerIDs列表的预先选择那个价值.没有必要我认为在选择列表的视图模型或了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);
    }
Run Code Online (Sandbox Code Playgroud)