【问题标题】:The ViewData item that has the key 'XXX' is of type 'System.String' but must be of type 'IEnumerable<SelectListItem>' [duplicate]具有键“XXX”的 ViewData 项属于“System.String”类型,但必须属于“IEnumerable<SelectListItem>”类型 [重复]
【发布时间】:2017-01-22 15:04:00
【问题描述】:

对 MVC 很陌生。尝试提交包含静态 DropDownListFor 的表单时出现以下异常。

The ViewData item that has the key 'CurrentPosition' is of type 'System.String' but must be of type 'IEnumerable<SelectListItem>'.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The ViewData item that has the key 'CurrentPosition' is of type 'System.String' but must be of type 'IEnumerable<SelectListItem>'.

Source Error: 


Line 36:            @Html.LabelFor(m => m.CurrentPosition, new { @class = "col-md-2 control-label" })
Line 37:            <div class="col-md-10">
Line 38:                @Html.DropDownListFor(m => m.CurrentPosition, ViewData["Positions"] as SelectList)
Line 39:                @Html.ValidationMessageFor(m => m.CurrentPosition, "", new { @class = "text-danger" })
Line 40:            </div>

型号:

[Display(Name = "Current Position")]
[Required(ErrorMessage = "Please select their current position")]
public string CurrentPosition { get; set; }

查看:

<div class="form-group">
    @Html.LabelFor(m => m.CurrentPosition, new { @class = "col-md-2 control-label" })
    <div class="col-md-10">
        @Html.DropDownListFor(m => m.CurrentPosition, ViewData["Positions"] as SelectList)
        @Html.ValidationMessageFor(m => m.CurrentPosition, "", new { @class = "text-danger" })
    </div>
</div>

控制器:

[HttpGet]
public ActionResult Sales()
{
    var positions = new SelectList(new []
    {
        new { value = 0, text = "Select a Position..." },
        new { value = 1, text = "Merchandiser" },
        new { value = 2, text = "ISR" },
        new { value = 3, text = "TM" },
        new { value = 4, text = "AISR" },
        new { value = 5, text = "TAM" },
        new { value = 6, text = "BAM" },
        new { value = 7, text = "CSR" },
        new { value = 8, text = "Director" },
        new { value = 9, text = "TSM" },
        new { value = 10, text = "Tel-Sell" },
        new { value = 11, text = "Graphics" },
        new { value = 12, text = "Shelf Set" },
        new { value = 13, text = "Secretary" },
        new { value = 14, text = "POS" },
        new { value = 15, text = "Other" }
    },
    "value", "text", 1);

    ViewData["Positions"] = positions;

    return View();
}

我已经尝试了几种不同的方法,如果我直接在视图中静态填充列表项,似乎只能让它工作,我认为这不正确,因为我将在此视图中再次使用此列表.你怎么看?

编辑:发布操作。暂时是空的。

[HttpPost]
public ActionResult Sales(SalesViewModel model)
{
    return View(model);
}

【问题讨论】:

    标签: asp.net-mvc razor


    【解决方案1】:

    具有键“XXX”的 ViewData 项的类型为“System.String” 但必须是“IEnumerable”类型。

    通常,当您将表单提交到 http post 操作方法时,您会收到此错误,并且在其中您将相同的(视图)模型返回到视图 而不重新加载呈现 SELECT 元素所需的数据。

    我猜你当前的代码是这样的

    [HttpPost]
    public ActionResult Sales(SomeViewModel model)
    {
       if(ModelState.IsValid)
       {
         // to do : Save and Redirect (PRG pattern)
       }
       return View(model);
    }
    

    由于我们的视图代码正在使用数据集到 ViewData 字典中,您需要确保在调用 return View() 之前重新加载 ViewData["Positions"]

    [HttpPost]
    public ActionResult Sales(SomeViewModel model)
    {
        var positions = new SelectList(new []
        {
           new { value = 0, text = "Select a Position..." },
           new { value = 1, text = "Merchandiser" },
           new { value = 8, text = "Director" }
       },"value", "text", 1);
    
       ViewData["Positions"] = positions;  // Reloading the data here
       return View(model);
    }
    

    如果您不使用 ViewData/ViewBag,而是使用视图模型,则需要执行相同的操作。将视图模型属性重新加载到填充 SELECT 元素所需的集合中。

    【讨论】:

    • 谢谢,成功了!
    • 没有。它应该在 HttpPost 上。现已更正
    猜你喜欢
    • 2013-01-19
    • 2015-09-18
    • 2016-03-25
    • 2012-05-23
    • 2018-07-24
    • 1970-01-01
    相关资源
    最近更新 更多