如何解决未送回控制器的模型故障?

时间:2016-08-29 12:38:43

标签: asp.net-mvc post

我有以下页面尝试发回模型中的数据。目前,我只想让模型处于未经处理的状态,只是为了看到我收到了我发送给客户的任何内容。

@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) { ... }

我缺少什么,如何排除故障?我感觉它很简单,当有人向我指出时,我会感到非常愚蠢。

2 个答案:

答案 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" />
}