【问题标题】:ASP.NET MVC Persisting mdoel's ID value when EditingASP.NET MVC 在编辑时保留 mdoel 的 ID 值
【发布时间】:2010-03-16 23:15:30
【问题描述】:
public Edit(int? id){ /* Codes */ }

[HttpPost]
public Edit(Item model){ /* Codes */ }

我在第一个 Edit 方法中检索了 Item 的副本,其中包含 ItemID 的值。但是当它到达 HttpPost 方法时,id 值就丢失了。

如果切换到

public Edit(int? ItemID){ /* Codes */ }

[HttpPost]
public Edit(Item model){ /* Codes */ }

这样,ItemID 可以被持久化在 Item 模型中。 但这是处理它的好方法吗? ASP.NET MVC 是否总是能够知道它需要将“ItemID”插入到 Item 中? 还有其他方法可以保留 ID 值吗?谢谢。

【问题讨论】:

  • 请查看提交表单中的数据是否正确映射到第二个Edit方法中的模型对象。

标签: asp.net-mvc


【解决方案1】:

我无法理解您是如何在 HttpPost 处理中丢失 id 的。也许您应该检查一下您的活页夹并可能为自己写一个?以我的经验,默认的活页夹有点麻烦。你可以从 here 开始,虽然我不假装它是最好的解决方案。如果您需要手动编写许多活页夹,请查看一些可以帮助您以声明方式进行转换的工具,例如 AutoMapper

【讨论】:

    【解决方案2】:

    您是否尝试将 id 作为参数添加到 Post 操作?

    public Edit(int? id){ /* Codes */ }
    
    [HttpPost]
    public Edit(int id, Item model){ /* Codes */ }
    

    这样,当表单被回发时,id 将从 URL 中填充。

    【讨论】:

    • 在这种情况下,项目模型参数有点奇怪。
    • 一点也不。这是获取 id 的一种非常合法的方式。考虑到您要访问一个已经包含 ID 的 URL,为什么不返回带有 ID 的 URL?
    • 我就是这样做的。只需确保检查 id 的权限,因为它可以轻松更改 - 这适用于任何方法,它并不特定于这个。
    • 我同意这看起来不太正确,因为该方法现在接受两个 id。如果您遵循约定,模型上的 id 应该由模型绑定器设置。
    • 在我看来,您不应该将任何模型传递给包含确定您的编辑帖子的 ID 的视图。您应该使用仅包含用于设置相对 URL 的 ID 的视图模型,但我承认这是个人偏好。
    【解决方案3】:

    您的Item 模型上的属性是否称为ItemID?如果是这样,那么如果您传递一个名为ID 的字段,则默认模型绑定器将不会填充它。如果您更改方法签名以使参数名称与您的 Item 属性名称匹配,则它应该可以按预期工作。

    【讨论】:

      【解决方案4】:

      Phil Haack 的帖子可能与您正在做的事情相关,也可能不相关。

      另外,如果您没有将 ID 作为表单的一部分(隐藏字段或诸如此类)发送给客户端,并且它不是 POST URL 的一部分,那么只有您没有在 POST 上正确填充的 ID 字段。

      【讨论】:

        【解决方案5】:

        解决ID问题的MVC 2方式是Optional URL Parameters

        如果您仍在使用 MVC 1,请在方法参数上使用绑定属性:

        [HttpPost]
        public ActionResult Edit([Bind(Exclude = "ItemID")] Item model)
        {
            // ...
        }
        

        【讨论】:

          【解决方案6】:

          答案有点晚,但是在使用剃刀时,通常使用隐藏字段来将 Id 绑定到模型。

                  @Html.HiddenFor(model => model.Id)
          

          完整的表单帖子可能如下所示:

          @using (Html.BeginForm())
          {
              @Html.AntiForgeryToken()
          
              <div class="form-horizontal">
                  <h4>Address</h4>
                  <hr />
                  @Html.ValidationSummary(true, "", new { @class = "text-danger" })
                  @Html.HiddenFor(model => model.Id)
          
                  <div class="form-group">
                      @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
                      <div class="col-md-10">
                          @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
                          @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
                      </div>
                  </div>
          
                  <div class="form-group">
                      @Html.LabelFor(model => model.StreetLine1, htmlAttributes: new { @class = "control-label col-md-2" })
                      <div class="col-md-10">
                          @Html.EditorFor(model => model.StreetLine1, new { htmlAttributes = new { @class = "form-control" } })
                          @Html.ValidationMessageFor(model => model.StreetLine1, "", new { @class = "text-danger" })
                      </div>
                  </div>
          
                  <div class="form-group">
                      <div class="col-md-offset-2 col-md-10">
                          <input type="submit" value="Save" class="btn btn-default" />
                      </div>
                  </div>
              </div>
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-02-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-11
            • 1970-01-01
            相关资源
            最近更新 更多