2010-10-22 84 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