Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC中绑定数据到dropdownlist的问题_C#_Asp.net Mvc_Binding_Drop Down Menu - Fatal编程技术网

C# MVC中绑定数据到dropdownlist的问题

C# MVC中绑定数据到dropdownlist的问题,c#,asp.net-mvc,binding,drop-down-menu,C#,Asp.net Mvc,Binding,Drop Down Menu,在学习MVC的过程中,在过去的两天里,试图将数据库中的数据绑定到MVC中的dropdownlist时遇到了很大的困难。我目前正在学习nerddinner教程。我一直严格遵循它,但不知何故还是以这个错误告终 具有该键的ViewData项 “晚餐。乡村”是一种 “System.String”,但必须是类型 “IEnumerable” 我知道这有很多代码要看,但如果有人想看一看,我会非常感激 这是我的密码: ViewModel.cs public class DinnerFormViewModel

在学习MVC的过程中,在过去的两天里,试图将数据库中的数据绑定到MVC中的dropdownlist时遇到了很大的困难。我目前正在学习nerddinner教程。我一直严格遵循它,但不知何故还是以这个错误告终

具有该键的ViewData项 “晚餐。乡村”是一种 “System.String”,但必须是类型 “IEnumerable”

我知道这有很多代码要看,但如果有人想看一看,我会非常感激

这是我的密码:

ViewModel.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);
        }
//
        //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));
        }
dinerscontroller.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);
        }
//
        //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>

m、 晚餐。国家,查看数据[“国家”]作为选择列表)%>
m、 晚餐。国家,“*””>
此外,我还注释了一些代码,它们来自于本教程前面的内容,可以忽略。此外,对于任何能够真正理解堆栈跟踪的人来说,这里是:

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
InvalidOperationException:具有键“Dinner.Country”的ViewData项的类型为“System.String”,但必须为“IEnumerable”类型。]
System.Web.Mvc.Html.SelectExtensions.GetSelectData(HtmlHelper HtmlHelper,字符串名)+458
System.Web.Mvc.Html.SelectExtensions.SelectInternal(HtmlHelper HtmlHelper,字符串选项标签,字符串名称,IEnumerable`1选择列表,布尔allowMultiple,IDictionary`2 htmlAttributes)+321
System.Web.Mvc.Html.SelectExtensions.dropdownlessAlper(HtmlHelper HtmlHelper,字符串表达式,IEnumerable`1选择列表,字符串选项标签,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\U dinners\U edit\U aspx.\U RenderContent2(HtmlTextWriter\UW,控制参数容器)在c:\Users\TaraW\Documents\Visual Studio 2010\Projects\NerdDinner\NerdDinner\views\diners\edit.aspx:52中
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter编写器,ICollection子对象)+109
System.Web.UI.Control.RenderChildren(HtmlTextWriter)+8
System.Web.UI.Control.Render(HtmlTextWriter)+10
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter编写器、ControlAdapter)+27
System.Web.UI.Control.RenderControl(HtmlTextWriter编写器、控制适配器)+100
System.Web.UI.Control.RenderControl(HtmlTextWriter)+25
ASP.views\u shared\u site\u master.\uuuu Render\uuuu control1(HtmlTextWriter\uuuuw,Control parameterContainer)在c:\Users\TaraW\Documents\Visual Studio 2010\Projects\NerdDinner\NerdDinner\views\shared\site中。master:26
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter编写器,ICollection子对象)+109
System.Web.UI.Control.RenderChildren(HtmlTextWriter)+8
System.Web.UI.Control.Render(HtmlTextWriter)+10
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter编写器、ControlAdapter)+27
System.Web.UI.Control.RenderControl(HtmlTextWriter编写器、控制适配器)+100
System.Web.UI.Control.RenderControl(HtmlTextWriter)+25
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter编写器,ICollection子对象)+208
System.Web.UI.Control.RenderChildren(HtmlTextWriter)+8
System.Web.UI.Page.Render(HtmlTextWriter)+29
System.Web.Mvc.ViewPage.Render(HtmlTextWriter)+56
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter编写器、ControlAdapter)+27
System.Web.UI.Control.RenderControl(HtmlTextWriter编写器、控制适配器)+100
System.Web.UI.Control.RenderControl(HtmlTextWriter)+25
System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)+3060
更改此选项:

<%: Html.DropDownListFor(m => m.Dinner.Country, ViewData["countries"] as SelectList)%>
m.Dinner.Country,查看数据[“国家”]作为选择列表)%>
致:

m.Dinner.Country,Model.Countries.Items)%%>

首先,您需要定义一个属性,该属性将在视图模型上保存选定的国家/地区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) %>
m.SelectedCountry,Model.Countries)%%>

谢谢你的回复,但运气不好。