为什么ASP.NET MVC中的Action方法中的模型为空?

时间:2016-04-12 08:15:16

标签: asp.net-mvc

我的问题是,点击按钮" Save"后,我从视图传递给控制器​​的模型为空。

这是我的View和Controller的代码。 你知道我做错了吗? 非常感谢你。

查看 Certificazioni.cshtml

@model List<ElencoCertificazioniItem>
...

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
...
        <tbody>
        @{
             for (int i = 0; i < Model.Count; i++)
             {
                  <tr>
                     <td>@Html.LabelFor(m => Model[i].Id) </td>
                     <td>@Html.LabelFor(m => Model[i].description)</td>
                     <td>@Html.EditorFor(m => Model[i].Field1.Value)</td>
                     <td>@Html.EditorFor(m => Model[i].Field2.Value)</td>
                   </tr>
              }
           }
          </tbody>
         }
 ....

   }

控制器

    [HttpPost]
    [ValidateAntiForgeryToken]
    [HttpParamAction]
    public ActionResult SaveItems(List<ElencoCertificazioniItem> model)
    {
        //the items here is null!!! ;(
        return saveItems(model);
    }

模型

public class ElencoCertificazioniItem
{
    public int Id { get; set; }
    public string description { get; set; }
    public bool? Field1 { get; set; }
    public bool? Field2 { get; set; }

}

我使用HttpParamAction来管理对不同方法控制器的调用(我在同一个表单中有2个按钮)。

public class HttpParamActionAttribute : ActionNameSelectorAttribute
{
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
            return true;

        var request = controllerContext.RequestContext.HttpContext.Request;
        return request[methodInfo.Name] != null;
    }
}

列表不为空且包含正确的计数元素,但其中的项目为null,Id属性始终为0!

1 个答案:

答案 0 :(得分:1)

您的ID和说明将始终为0且为空,因为您不会使用任何输入在表单中发布它们。如果要返回它们,则必须使用输入hiddent传递此值

<tr>
    <td>
        @Html.LabelFor(m => Model[i].Id)
        @Html.HiddenFor(m => Model[i].Id)
    </td>
    <td>
        @Html.LabelFor(m => Model[i].description)
        @Html.HiddenFor(m => Model[i].description)
    </td>
    <td>@Html.EditorFor(m => Model[i].Field1)</td>
    <td>@Html.EditorFor(m => Model[i].Field2)</td>
</tr>