Asp.net mvc 回传时,视图中呈现的MVC模型数据为空

Asp.net mvc 回传时,视图中呈现的MVC模型数据为空,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我已经看到了类似的问题,并遵循了常规的答案,即确保所有模型数据都以HTML格式呈现 我已经这样做了,模型在视图中以@Html.HiddenFor()呈现,但是当发回控制器时,列表中没有项目 视图将愉快地呈现列表中的多个项目,但发布数据中的列表项目始终为空列表(非空) 型号 public class ItemCollection { public List<string> AvailiableActions { get; set; } public List<I

我已经看到了类似的问题,并遵循了常规的答案,即确保所有模型数据都以HTML格式呈现

我已经这样做了,模型在视图中以@Html.HiddenFor()呈现,但是当发回控制器时,列表中没有项目

视图将愉快地呈现列表中的多个项目,但发布数据中的
列表项目
始终为空列表(非空)

型号

public class ItemCollection
{
    public List<string> AvailiableActions { get; set; } 
    public List<Item> Items { get; set; } 
}

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string SelectedAction { get; set; }
}

不能使用
foreach
循环来呈现集合的控件。它呈现重复的
id
name
属性,而不需要绑定到集合的必要索引器。对循环使用

for (int i = 0; i < Model.Items.Count; i++)
{ 
  <tr>
    <td>
      @Html.HiddenFor(m => m.Items[i].Id)
      @Html.DisplayFor(m => m.Items[i].Name)
    </td>
    <td>@Html.DropDownList(m => m.Items[i].SelectedAction, new SelectList(Model.AvailiableActions))</td>
  </tr>
}
for(int i=0;im.Items[i].Id)
@DisplayFor(m=>m.Items[i].Name)
@DropDownList(m=>m.Items[i].SelectedAction,新建SelectList(Model.availableActions))
}

注意,您的视图还包括
@Html.HiddenFor(m=>Model.Items)
@Html.HiddenFor(m=>item)
,这也会失败,因为
item
是一个复杂的对象,您只能绑定到值类型。你需要删除两个.< /p> ,而不是遍历所有项以确保索引被添加到生成的输出中,你可以考虑使用<强> EdgRooDeS> <强> >(

)。 EditorTemplates允许您在
\Views\Shared\EditorTemplates\Item.cshtml
中为单个
项指定模板:

@model Item
@{
    var options= (List<string>)ViewData["Options"];
 }
 <tr>
     <td>
         @Html.HiddenFor(m => m.Id)
          @Html.DisplayFor(m => m.Name)
     </td>
     <td>@Html.DropDownList(m => m.SelectedAction, new SelectList(options))</td>
 </tr>
@模型项
@{
变量选项=(列表)视图数据[“选项”];
}
@Html.HiddenFor(m=>m.Id)
@DisplayFor(m=>m.Name)
@DropDownList(m=>m.SelectedAction,新建SelectList(选项))
然后,您只需将视图更改为:

@model ItemCollection
@using (Html.BeginForm("myAction", "myController", FormMethod.Post))
{
    <fieldset>
        <div>
            <table>
                @Html.EditorFor(m => m.Items, new {Options = Model.AvailiableActions })
            </table>
        </div>
    </fieldset>
}
@model ItemCollection
@使用(Html.BeginForm(“myAction”、“myController”、FormMethod.Post))
{
@EditorFor(m=>m.Items,新的{Options=Model.availableActions})
}

我们需要这个@Html.HiddenFor(m=>item)吗?非常感谢。工作是一种享受。复杂类型上的Html.HiddenFor是一个试图修复它的尝试,在哪里可以设置编辑器模板中读取的ViewData?事实上,在我写下它在控制器中得到:)不,它在主视图中的调用中:
@Html.EditorFor(m=>m.Items,new{Options=Model.availableactions}
当然,GET控制器必须填充
availabiableAction
,但这与您的示例中的情况相同,谢谢。由于不知道如何通过该列表,我以前没有这样做过
@model Item
@{
    var options= (List<string>)ViewData["Options"];
 }
 <tr>
     <td>
         @Html.HiddenFor(m => m.Id)
          @Html.DisplayFor(m => m.Name)
     </td>
     <td>@Html.DropDownList(m => m.SelectedAction, new SelectList(options))</td>
 </tr>
@model ItemCollection
@using (Html.BeginForm("myAction", "myController", FormMethod.Post))
{
    <fieldset>
        <div>
            <table>
                @Html.EditorFor(m => m.Items, new {Options = Model.AvailiableActions })
            </table>
        </div>
    </fieldset>
}