none
There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'listname'. RRS feed

  • 问题

  • mvc 中, AbcController 代码:

    public ActionResult Create() { List<SelectListItem> items = new List<SelectListItem>() { new SelectListItem(){Text="A", Value="a1", Selected = true}, new SelectListItem(){Text="B", Value="b1"}, }; ViewData["listname"] = new SelectList(items, "Value", "Text"); return View(); } [HttpPost] public ActionResult Create(FormCollection fc) {

    Response.Write("<script type='text/javascript'>alert('aaa');</script >");

    return View(); }


    2017年3月7日 23:34

答案

  • 终于搞定了,ThankfulHeart
    云里雾里的解答,还是要说声谢谢!
    • 已标记为答案 fss199 2017年3月16日 1:22
    2017年3月16日 1:21
  • MVC work different than ASP.Net, you need to rebind you model in Post action once again and pass it to your view.

              List<SelectListItem> generateList()
            {
                return new List<SelectListItem>()
                {
                    new SelectListItem(){Text="a", Value="a1", Selected = true},
                    new SelectListItem(){Text="b", Value="b1"},
                };
            }
     public ActionResult Register()
            {
                RegisterViewModel rv = new RegisterViewModel();
                rv.Select =  generateList();
    
                return View(rv);
            }
            
            [HttpPost]
            public ActionResult Register(RegisterViewModel m)
            {
                RegisterViewModel rv = new RegisterViewModel();
                rv.Select =  generateList();
    
                Response.Write("<script type='text/javascript'>alert('" + m.aaa + " ');</script >");
                return View(rv);
            }

    • 已标记为答案 fss199 2017年3月16日 1:30
    2017年3月16日 1:30

全部回复

  • 在 view cshtml文件中

    @Html.DropDownList("listname")

    运行后,submit 报错:

    There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'listname'.

    2017年3月7日 23:36
  • 应该是 @ViewData["listname"]  ,而不是"listname"


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年3月8日 9:53
  • 谢谢,不行啊
    2017年3月8日 13:50
  • 谢谢,不行啊

    1)请问你的View页面还是指“Create”那个页面吗?

    2)给出你的View的全部代码,谢谢。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年3月9日 6:11
  • model:

    public class RegisterViewModel
        {
            public IEnumerable<SelectListItem> aaa { get ; set; }
        }

    view:

    @model test.Models.RegisterViewModel
    
    @using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
    {
        @Html.DropDownListFor(m => m.aaa, ViewData["d"] as SelectList)
        <input type="submit" class="btn btn-default" value="注册" />
    }

    controls:

            public ActionResult Register()
            {
                List<SelectListItem> items = new List<SelectListItem>()
                {
                    new SelectListItem(){Text="a", Value="a1", Selected = true},
                    new SelectListItem(){Text="b", Value="b1"},
                };
     
                ViewData["d"] = new SelectList(items, "Value", "Text");            
                return View();
            }
     
            [HttpPost]
            public async Task<ActionResult> Register(RegisterViewModel model)
            {
    
                //这里如何取到被选中的text
    
             }

    2017年3月10日 0:05
  • 请仔细看你的HTML生成源代码,记住<select>标签的name,然后如下替换:

    public class FormModel
    {
        public string YourSelectTagName{get;set;}
    }
      [HttpPost]
            public async Task<ActionResult> Register(FormModel model)
            {
                   //处理你的逻辑……
             }

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年3月10日 0:21
  • model,如果改为:

        public class RegisterViewModel
        {
            public string aaa { get; set; }
        }
    提示错误:
    The ViewData item that has the key 'aaa' is of type 'System.String' but must be of type 'IEnumerable<SelectListItem>'.”

    2017年3月10日 1:30
  • 你错误理解我的意思了。你的Select生成的HTML代码应该如下:

    <select name="aaa">
      <option value="1">A</aoption>
    </select>

    那么你不能修改RegisterModel,而是必须额外地增加一个Model,用于进行对于Select提交的数据绑定。请严格按照我的上面代码。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年3月11日 1:46
  • 现在html如下:

    <select id="aaa" name="aaa">
    <option value="a1">a</option>
    <option value="b1">b</option>
    </select>
    
    额外地增加一个Model,要怎么写啊

    2017年3月11日 14:24
  • [HttpPost] public ActionResult Create(FormModel fm) {

    //Do your logic here.

    }


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年3月12日 2:14
  • 控制器中,原来就有 get 和 post 的 Register代码 ,难道还要再创建 一个 post 的 Register 。

    还是不能理解您的意思,能不能给个比较完整的代码?

    2017年3月12日 7:57
  • 或者给个参考的博文。

    查了很多,都没有解决问题,我也知道,用json,很容易传到后台。
    2017年3月12日 14:09
  • 根据你View生成的HTML创建一个新的Model,然后作为Post提交。

    其中属性名称必须和form中每一项的name对应。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年3月14日 6:24
  • model:

        public class RegisterViewModel
        {
            public IEnumerable<SelectListItem> aaa { get; set; }        
    
        }
        public class FormModel
        {
            public string aaa { get; set; }
        }

    controller:

    public ActionResult Register() { List<SelectListItem> items = new List<SelectListItem>() { new SelectListItem(){Text="a", Value="a1", Selected = true}, new SelectListItem(){Text="b", Value="b1"}, }; ViewData["d"] = new SelectList(items, "Value", "Text"); return View(); } // // POST: /Account/Register [HttpPost] public ActionResult Register(RegisterViewModel m,FormModel model) { Response.Write("<script type='text/javascript'>alert('" + model.aaa.ToString() + " ');</script >");

    //这里还是无法取到被选中的值 return View(); }

    view:

    @Html.DropDownListFor(
        x => x.aaa,
        ViewData["d"] as IEnumerable<SelectListItem>,
        "-- select a reason --"
    )

    2017年3月14日 12:51
  • view 中,要怎么调
    FormModel

    2017年3月14日 12:52
  • 为什么你的Register有2个Model?只需要一个FormModel啊。请先保证无参数的那个Register返回的View生成的Select的HTML的name是“aaa”。

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年3月15日 6:51
  • view:

                @Html.DropDownListFor(d => d.aaa, Model.Select,"-- select --")

    生成后的html:

                <select id="aaa" name="aaa"><option value="">-- select --</option>
    <option selected="selected" value="a1">a</option>
    <option value="b1">b</option>
    </select>
    


    model:

        public class RegisterViewModel
        {
            public IEnumerable<SelectListItem> Select { get; set; }
            public string aaa { get; set; }
    
        }


    controls:

            public ActionResult Register()
            {
                RegisterViewModel rv = new RegisterViewModel();
                rv.Select = new List<SelectListItem>()
                {
                    new SelectListItem(){Text="a", Value="a1", Selected = true},
                    new SelectListItem(){Text="b", Value="b1"},
                };
    
                return View(rv);
            }
            
            [HttpPost]
            public ActionResult Register(RegisterViewModel m)
            {
                Response.Write("<script type='text/javascript'>alert('" + m.aaa + " ');</script >");
                return View();
            }

    提交后报错:

    @Html.DropDownListFor(m => m.aaa, Model.Select, "-- select --")
    

    异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

    2017年3月15日 12:22
  • 网上看了很多,在mv3,mv4的好像都能解决问题。本程序是mv5,很多都通不过。郁闷中
    2017年3月15日 12:24
  • 终于搞定了,ThankfulHeart
    云里雾里的解答,还是要说声谢谢!
    • 已标记为答案 fss199 2017年3月16日 1:22
    2017年3月16日 1:21
  • MVC work different than ASP.Net, you need to rebind you model in Post action once again and pass it to your view.

              List<SelectListItem> generateList()
            {
                return new List<SelectListItem>()
                {
                    new SelectListItem(){Text="a", Value="a1", Selected = true},
                    new SelectListItem(){Text="b", Value="b1"},
                };
            }
     public ActionResult Register()
            {
                RegisterViewModel rv = new RegisterViewModel();
                rv.Select =  generateList();
    
                return View(rv);
            }
            
            [HttpPost]
            public ActionResult Register(RegisterViewModel m)
            {
                RegisterViewModel rv = new RegisterViewModel();
                rv.Select =  generateList();
    
                Response.Write("<script type='text/javascript'>alert('" + m.aaa + " ');</script >");
                return View(rv);
            }

    • 已标记为答案 fss199 2017年3月16日 1:30
    2017年3月16日 1:30