【问题标题】:post viewmodel with IList to controller post method使用 IList 将视图模型发布到控制器发布方法
【发布时间】:2013-08-13 21:27:17
【问题描述】:

我有一个带有 IList 的视图模型:

public class MyMaintenanceListViewModel
{
    public IList<MyMaintenance> MyMaintenanceList { get; set; }

    [Display(Name = "Network User Name:")]
    public string NetworkUserName { get; set; }

    [Display(Name = "Password:")]
    public string Password { get; set; }
}

我有一个视图,其模型设置为视图模型:

@model EMMS.ViewModels.MyMaintenanceListViewModel

@using (Html.BeginForm("SubmitMaintenance", "Maintenance"))
{
    <table id="searchtable" class="MyMaintenance">
        <tr>
            <th style="width: 50px; text-align: left;">Id</th>
            <th style="width: 200px; text-align: left;">Equipment Id</th>
            <th style="width: 100px; text-align: left;">Task Id</th>
            <th style="width: 150px; text-align: left;">Date Completed</th>
            <th style="width: 100px; text-align: left;">Elapsed Time</th>
            <th style="width: 200px; text-align: left;">Created</th>
            <th style="width: 50px;"></th>
        </tr>
    @for (int i = 0; i < Model.MyMaintenanceList.Count; i++)
    {
        var item = Model.MyMaintenanceList[i];
       <tr>
            <td>
                @Html.DisplayFor(modelItem => item.RowId)
                @Html.HiddenFor(modelItem => item.RowId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.EquipmentId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TaskId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.DateCompleted)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ElapsedTimeMinutes)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.CreateDate)
            </td>
        </tr>
    }
    </table>
}

我的控制器看起来像这样:

[HttpPost]
public ActionResult SubmitMaintenance(MyMaintenanceListViewModel myMaintenanceListViewModel)
{
    // do something with IList "MyMaintenanceList" in myMaintenanceListViewModel
}

但是,当我对上面的控制器 post 方法进行断点并提交表单时,myMaintenanceListViewModel 中的 MyMaintenanceList 列表显示 count=0,即使视图中有项目。如何将此表中的项目传递给我的控制器中的 post 方法?

我正在尝试遍历控制器中 MyMaintenanceList 列表中的项目。希望这是有道理的。

谢谢

【问题讨论】:

    标签: asp.net-mvc list controller http-post viewmodel


    【解决方案1】:

    MVC 模型绑定使用输入元素的名称属性将表单数据绑定到模型。 首先,您不应该在 for 循环中创建 item 变量。你应该像这样绑定数据:

        <tr>
                <td>
                    @Html.DisplayFor(modelItem => Model.MyMaintenanceList[i].RowId)
                    @Html.HiddenFor(modelItem => Model.MyMaintenanceList[i].RowId)
                </td>
       </tr>
    

    其次,如果您将数据发布到服务器,您应该使用输入类型元素。所以如果你想在 RowId 旁边发布数据到服务器,你必须使用 Html.HiddenFor 作为 MyMaintenanceList 的其他属性。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      除了简单的 CRUD 应用程序之外,接受 [HttpPost] 方法的视图模型是一种糟糕的形式。 ViewModel 用于查看,而不是用于发布。

      请尝试:

      [HttpPost]
      public ActionResult SubmitMaintenance(IList<MyMaintenance> myMaintenanceList)
      {
          //Validate and then send to database
      }
      

      【讨论】:

      • 那么如果不是视图模型,我如何在发布时获取视图中的更改值(使用视图模型填充)?
      • 在这和 Erdal 的建议之间,我得到了它的工作。本可以发誓我尝试将列表作为参数放入我的控制器中,但也许不是。谢谢!顺便说一句,我仍然对如何将视图模型数据传递回 post 方法感兴趣。我只是在学习 MVC,并希望遵循良好的做法
      • 所以我试图找出为什么将 VM 传递给 post 方法是错误的格式,但找不到任何东西。我确实找到了很多这样做的例子,比如来自 Darin Dimitrov,他似乎在 stackoverflow 上回答了很多 MVC 帖子:stackoverflow.com/questions/9891040/…。如果由于某种原因不建议这样做,有人可以告诉我替代方案吗?谢谢!
      猜你喜欢
      • 2013-03-25
      • 2012-12-18
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      相关资源
      最近更新 更多