我有以下页面尝试发回模型中的数据。目前,我只想让模型处于未经处理的状态,只是为了看到我收到了我发送给客户的任何内容。
@model List<UserSetting>
@using (Html.BeginForm("SaveSettings", "Account", Model, FormMethod.Post))
{
<table>
<tr>
<th>User name</th>
<th>Setting</th>
<th>Value</th>
<th>Order</th>
</tr>
@foreach (UserSetting setting in Model)
{
<tr>
<td>@setting.User.UserName</td>
<td>@setting.Name</td>
<td>@setting.Value</td>
<td>@setting.Order</td>
</tr>
}
</table>
<input type="submit" />
}
但是,控制器中收到的对象为空。它不是 null ,所以我似乎发布了一些东西,但由于某种原因,某些内容包含零元素。
[HttpPost]
public void SaveSettings(List<UserSetting> settings) { ... }
我缺少什么,如何排除故障?我感觉它很简单,当有人向我指出时,我会感到非常愚蠢。
答案 0 :(得分:4)
您只需显示项目,这些项目不会神奇地创建隐藏的输入(在表单中获取数据所需的输入)。
顺便说一句,而不是使用@Html.DisplayFor
来显示,这将为你管理一些空检查。
你需要一个for循环,它不适用于foreach,正如Stephen Muecke的评论所述。
所以
@for(var i = 0; i < Model.Count; i++)
{
<tr>
<td>@Html.HiddenFor(m => Model[i].User.UserName) @Html.DisplayFor(m => Model[i].User.UserName)</td>
<td>@Html.HiddenFor(m => Model[i].Name) @Html.DisplayFor(m => Model[i].Name)</td>
<td>@Html.HiddenFor(m => Model[i].Value) @Html.DisplayFor(m => Model[i].Value)</td>
<td>@Html.HiddenFor(m => Model[i].Order) @Html.DisplayFor(m => Model[i].Order)</td>
</tr>
}
当然,如果您想编辑数据,可以替换
@Html.HiddenFor(m=> Model[i].xxx) @Html.DisplayFor(m => Model[i].xxx)
通过
@Html.TextBoxFor(m => Model[i].xxx)
答案 1 :(得分:1)
您的代码中有两个问题。首先是@RaphaelAlthaus解决,但第二个是你隐含地指定要发回的模型。我在BeginForm
构造函数中跳过它,它可以工作。
@using (Html.BeginForm("SaveSettings", "Account", FormMethod.Post))
{
<table>
<tr>
<th>Value</th>
</tr>
@for (int i = 0; i < Model.Count; i++)
{
<tr>
<td>@Html.TextBoxFor(_ => Model[i].Value)</td>
</tr>
}
</table>
<input type="submit" />
}