asp.net-mvc - asp.net mvc 3 预选 Html.DropDownListFor 不在 Nerd 晚餐中工作

标签 asp.net-mvc asp.net-mvc-3 html.dropdownlistfor

了解下拉列表,我正在尝试为 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)。

最佳答案

看完herehere ,终于明白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/

相关文章:

asp.net-mvc - 如何在我的 ASP.NET MVC 代码中避免标签汤?

javascript - Angularjs:在http请求 header 上设置授权

javascript - 通过jquery检查页面加载本身是否选中复选框

asp.net - 如何显示表中的所有记录 ASP.NET MVC 3

asp.net - 在 ASP.NET MVC 中验证时拒绝下拉占位符

css - 即使最小化,如何使布局居中?

asp.net-mvc - Html.DropdownListFor 未设置选定值

arrays - 将 HttpPostedFileBase 转换为 byte[]

asp.net - 在 Asp.Net MVC View 中使用 dropdownlistfor 和 foreach 吗?

asp.net - 未为 ASP.Net MVC 3 DropDownListFor 设置所选值