【问题标题】:MVC5 passing a Model item from View to a ControllerMVC5 将模型项从视图传递到控制器
【发布时间】:2016-05-16 14:22:21
【问题描述】:

我正在使用 .Net MVC5,并且我正在尝试使用编辑链接(或按钮)创建一个索引视图,该链接将发布(因此我不能使用 ActionLink)中显示的实体列表中的整个模型项实体风景。我该怎么做?

我的代码(到目前为止)在下面

@model IEnumerable<Projname.Models.MyEntity>
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table class="table">
        <tr>

            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>Hello there</th>
            <th>life is good</th>
            </tr>

    @foreach (var item in Model) {
        <tr>

            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>

                @using (Html.BeginForm("Edit", "Edit", FormMethod.Post))
                {
                    @Html.Hidden(mytem => item);

            <input type="submit" value="Edit" class="btn btn-default" />
                }
            </td>
            <td>                
                @Html.ActionLink("Details", "Details", new { id = item.PrimeKey }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.PrimeKey })
            </td>
            </tr>
    }

    </table>
</body>
</html>

我假设有更好的方法来代替为实体的每个属性创建一个隐藏字段。

【问题讨论】:

  • 只传递 myItem 的 ID/主键,并在将项目传递到编辑视图时从数据库中重新检索它。
  • 为什么要传递整个模型,只有 ID 就可以了
  • @AWinkle 通常我会这样做,但由于我使用的是 Azure 表,因此仅在查询中指定行键(主键)会导致不希望的全表扫描 stackoverflow.com/questions/19715885/…。所以我尽量避免它。
  • @JOW 根据我的知识和下面的答案,我认为您将不得不将所有内容包装在一个隐藏字段中。由于这是在视图渲染过程中,您可以使用 JSON 序列化程序(例如 NewtonSoft)将对象序列化为单个隐藏字段。这将限制模型更改的风险并使编码更容易,尽管它的性能可能不如对每个字段使用 HiddenFor。
  • 首先,您不能使用foreach 循环为集合生成表单控件(请参阅this answer。其次,查看您在@Html.Hidden(mytem =&gt; item); 中生成的html 以了解为什么这永远无法工作(您需要为模型中的每个属性生成一个输入)。只需传递 ID 属性即可。

标签: c# .net asp.net-mvc asp.net-mvc-5


【解决方案1】:

您需要将要编辑或更改的项目放入表单中

<form class="form-horizontal" action="GetItemsFromView" method="post">
    <input type="text" name="EditedModelItem">
</form>

之后,您可以调用控制器中的任何已编辑项目,通过 字符串持有 = Request.Form["EditedModelItem"]; 在 GetItemsFromView 方法中。

【讨论】:

    【解决方案2】:

    把所有东西都包进去:

    @using (Html.BeginForm("Edit", "Edit", FormMethod.Post))
    {                
    }
    

    然后:

     public ActionResult Edit(Model model)
     {
          if (ModelState.IsValid)
          {
          }
     }
    

    或者:

    public ActionResult Edit(FormCollection formCollection)
    {
    }
    

    【讨论】:

      猜你喜欢
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      相关资源
      最近更新 更多