Asp.net mvc 具有键';XXX和x27;类型为';System.String';但必须为'型;IEnumerable<;选择列表项>';

Asp.net mvc 具有键';XXX和x27;类型为';System.String';但必须为'型;IEnumerable<;选择列表项>';,asp.net-mvc,razor,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 exec

对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>
视图:

我已经尝试了几种不同的方法,只有在静态地直接在视图中填充列表项时,才能使其工作,但我发现这不正确,因为我将在此视图中再次使用此列表。你觉得怎么样

编辑:发布操作。现在是空的

[HttpPost]
public ActionResult Sales(SalesViewModel model)
{
    return View(model);
}
具有键“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[“Positions”]


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

谢谢,这很有效!不,应该在HttpPost上。现在更正
[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);
}
[HttpPost]
public ActionResult Sales(SomeViewModel model)
{
   if(ModelState.IsValid)
   {
     // to do : Save and Redirect (PRG pattern)
   }
   return View(model);
}
[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);
}