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