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

时间:2016-09-14 17:46:09

标签: asp.net-mvc razor

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);
}

1 个答案:

答案 0 :(得分:10)

  

具有键&#39; XXX&#39;的ViewData项。属于&#39; System.String&#39;   但必须属于&#39; IEnumerable&#39;。

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

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

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

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

[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元素所需的集合。