Asp.net-Mvc

asp.net mvc 3 預選 Html.DropDownListFor 不在書呆子晚餐中工作

  • August 10, 2015

了解下拉列表,我試圖在Scott Gu 的部落格中為 nerddinner 添加一個 RSVP 創建頁面,其中包含一個 Html.DropDownListFor 列出可用的晚餐。

我可以填充下拉列表,但無法讓下拉列表預先選擇我想要的值(“樣品晚餐 2”)。我使用初始化器在數據庫中播種一些晚餐對象。該數據庫是使用 EF ‘程式碼優先方法’的 sql ce 4。抱歉,我知道這是 av 常見問題,不想問,但老實說,我在這方面花了很多時間,但無法讓它發揮作用:

視圖模型

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>

因此,在頁面載入時不會預先選擇值為“Sample Dinner 2”的下拉列表。當我做出選擇並點擊送出時,列表顯示正常並設置了正確的 DinnerID。

也試試這個:

@Html.DropDownListFor(x => x.SelectedItem, Model.DinnersList)

但沒有設置或綁定到 Rsvp.DinnerID。

這從列表中預選但不綁定(或設置 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。我認為這叫做綁定。

在閱讀herehere之後,我終於明白了HtmlDropDownlistFor如何根據您的模型自動在下拉列表中選擇正確的項目-在RSVP中選擇一個dineID(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);
   }

引用自:https://stackoverflow.com/questions/4800447