2010-10-22 83 views
1

學習MVC並在過去兩天中嘗試將數據庫中的數據綁定到MVC中的下拉列表時遇到重大問題。我目前正在遵循nerddinner教程。我跟着它剛好,並以某種方式仍然以此錯誤結束。將數據綁定到MVC中的dropdownlist的問題

具有關鍵 「Dinner.Country」的ViewData的產品類型 「System.String」的,但必須是類型 「的IEnumerable」的。

我知道這是很多代碼,但如果有人覺得如此傾向於查看它 - 我會非常感激。

這裏是我的代碼:

DinnerFormViewModel.cs

public class DinnerFormViewModel 
    { 
     private static string[] _countries = new[] { 
      "USA", 
      "UK", 
      "IRL", 
      "SA" 
     }; 

     //Properties 
     public Dinner Dinner { get; private set; } 
     public SelectList Countries { get; private set; } 

     //Constructor 
     public DinnerFormViewModel(Dinner dinner) 
     { 
      Dinner = dinner; 

      Countries = new SelectList(_countries, dinner.Country); 
     } 

DinnersController.cs

// 
     //GET: /Dinners/Edit/2 

     //[Authorize] 
     public ActionResult Edit(int id) 
     { 
      Dinner dinner = dinnerrepository.GetDinner(id); 

      //var countries = new[] { 
       // "USA", "Afganistan", "UK", "Ireland"}; 

      //ViewData["countries"] = new SelectList(countries, dinner.Country); 

      return View(new DinnerFormViewModel(dinner)); 
     } 

     // 
     //POST: /Dinners/Edit/2 

     [HttpPost] 
     public ActionResult Edit(int id, FormCollection formvalues) 
     { 
      //Retrieve Existing Dinner 
      Dinner dinner = dinnerrepository.GetDinner(id); 

      //Update dinner with form posted values 
      //dinner.Title = Request.Form["Title"]; 
      //dinner.Description = Request.Form["Description"]; 
      //dinner.EventDate = DateTime.Parse(Request.Form["EventDate"]); 
      //dinner.Address = Request.Form["Address"]; 
      //dinner.Country = Request.Form["Country"]; 
      //dinner.ContactPhone = Request.Form["ContactPhone"]; 

      if (TryUpdateModel(dinner)) 
      { 
       //Persist changes back to database 
       dinnerrepository.Save(); 
       //Perform HTTP redirect to details page for the saved dinner 
       return RedirectToAction("Details", new { id = dinner.DinnerID }); 
      } 

      //var countries = new[] { 
       // "USA", "Afganistan", "UK", "Ireland"}; 

      //ViewData["countries"] = new SelectList(countries, dinner.Country); 

      return View(new DinnerFormViewModel(dinner)); 
     } 

這裏是從,是造成我查看代碼段問題 - Edit.aspx

<div class="editor-field"> 
       <%: Html.DropDownListFor(m => m.Dinner.Country, ViewData["countries"] as SelectList)%> 
       <%: Html.ValidationMessageFor(m => m.Dinner.Country, "*")%> 
      </div> 

此外,我有一些代碼註釋掉了,這些是從本教程的前面,可以忽略。此外,對於任何人誰可以真正瞭解堆棧跟蹤,在這裏它是什麼:

InvalidOperationException: The ViewData item that has the key 'Dinner.Country' is of type 'System.String' but must be of type 'IEnumerable<SelectListItem>'.] 
    System.Web.Mvc.Html.SelectExtensions.GetSelectData(HtmlHelper htmlHelper, String name) +458 
    System.Web.Mvc.Html.SelectExtensions.SelectInternal(HtmlHelper htmlHelper, String optionLabel, String name, IEnumerable`1 selectList, Boolean allowMultiple, IDictionary`2 htmlAttributes) +321 
    System.Web.Mvc.Html.SelectExtensions.DropDownListHelper(HtmlHelper htmlHelper, String expression, IEnumerable`1 selectList, String optionLabel, IDictionary`2 htmlAttributes) +48 
    System.Web.Mvc.Html.SelectExtensions.DropDownListFor(HtmlHelper`1 htmlHelper, Expression`1 expression, IEnumerable`1 selectList, String optionLabel, IDictionary`2 htmlAttributes) +115 
    System.Web.Mvc.Html.SelectExtensions.DropDownListFor(HtmlHelper`1 htmlHelper, Expression`1 expression, IEnumerable`1 selectList) +87 
    ASP.views_dinners_edit_aspx.__RenderContent2(HtmlTextWriter __w, Control parameterContainer) in c:\Users\TaraW\Documents\Visual Studio 2010\Projects\NerdDinner\NerdDinner\Views\Dinners\Edit.aspx:52 
    System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +109 
    System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 
    System.Web.UI.Control.Render(HtmlTextWriter writer) +10 
    System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 
    ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in c:\Users\TaraW\Documents\Visual Studio 2010\Projects\NerdDinner\NerdDinner\Views\Shared\Site.Master:26 
    System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +109 
    System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 
    System.Web.UI.Control.Render(HtmlTextWriter writer) +10 
    System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 
    System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208 
    System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 
    System.Web.UI.Page.Render(HtmlTextWriter writer) +29 
    System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +56 
    System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3060 

回答

3

首先,你需要定義屬性這將在您的視圖模型上保存選定的國家/地區ID:

public class DinnerFormViewModel 
{ 
    private static string[] _countries = new[] { 
     "USA", 
     "UK", 
     "IRL", 
     "SA" 
    }; 

    //Properties 
    public Dinner Dinner { get; private set; } 

    // will hold the selected country value 
    public string SelectedCountry { get; set; } 
    public SelectList Countries { get; private set; } 

    //Constructor 
    public DinnerFormViewModel(Dinner dinner) 
    { 
     Dinner = dinner; 
     Countries = new SelectList(_countries, dinner.Country); 
    } 
} 

然後:

<%: Html.DropDownListFor(m => m.SelectedCountry, Model.Countries) %> 
0

更改此:

<%: Html.DropDownListFor(m => m.Dinner.Country, ViewData["countries"] as SelectList)%> 

到:

<%: Html.DropDownListFor(m => m.Dinner.Country, Model.Countries.Items)%> 
+0

感謝您的回覆,但沒有運氣。 – 109221793 2010-10-23 09:00:12