【问题标题】:How to pass Model property from ActionLink to Post method (with asp.net core)?如何将模型属性从 ActionLink 传递给 Post 方法(使用 asp.net 核心)?
【发布时间】:2020-12-08 02:53:15
【问题描述】:

我一直在从 asp.net mvc 在 asp.net core mvc 中重新创建我的项目。

当我以前删除一个 Tag 对象时,我会通过索引页面的 ActionLink 将Tag.Name 发送到 Delete Post 方法。

@Html.ActionLink("Delete", "Delete", new { id = item.TagId, name = item.Name })

然后在控制器中,在删除(发布)时,我会像这样访问Name

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Delete(int id, string name)
{
}

虽然在 asp.net core 中 name 在 Post 方法中返回为 null (尽管在 Get 方法中正确返回)。

我可以在 Delete 的表单 Post 中通过 <input asp-for="Name" type="hidden" /> 检索 name,但我想知道为什么我不能像使用 asp.net 那样检索它?

以下观点仅供参考

  • asp.net
<dl class="dl-horizontal">
    <dt>
        @Html.DisplayNameFor(model => model.Name)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.Name)
    </dd>

</dl>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-actions no-color">
        <input type="submit" value="Delete" class="btn btn-default" /> |
        @Html.ActionLink("Back to List", "Index")
    </div>
}
  • asp.net 核心
<dl class="row">
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.Name)
    </dt>
    <dd class="col-sm-10">
        @Html.DisplayFor(model => model.Name)
    </dd>
</dl>

<form asp-action="Delete">
    <input type="submit" value="Delete" class="btn btn-danger" /> |
    <a asp-action="Index">Back to List</a>
</form>

谢谢

【问题讨论】:

  • 您误解了 HTTP 和 HTML 如何协同工作。 ActionLink 呈现一个&lt;a&gt; 元素只能发出GET 请求。要发出POST 请求,您需要一个&lt;form method="post"&gt; 元素。您是否仍然可以使用&lt;button type="submit" form="formIdGoesHere"&gt;Click me&lt;/button&gt; 提交具有类似链接外观的表单,但您需要直接呈现该表单,而不是使用ActionLink
  • @Dai 我明白了。然而,asp.net mvc 版本如何通过在 ActionLink 中声明它来在 Delete POST 方法中返回标签的名称?当我从 ActionLink 中删除它时,它是 Delete POST 方法中的 Null
  • 发布请求可能会绑定查询参数。但是您的 .net 核心表单操作可能没有。
  • 您是否在参数中尝试过 [FromQuery] ? public IActionResult Delete([FromQuery] name, [FromQuery] id ......

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


【解决方案1】:

正如 Jeremy Lakeman 所说,我们可以将参数作为查询字符串传递给 post 方法,但您应该在 form 标签的 action 方法中设置它。

建议你可以尝试修改asp.net核心代码,根据模型名和id设置action和method属性值。

更多细节,您可以参考以下代码:

<dl class="row">
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.Name)
    </dt>
    <dd class="col-sm-10">
        @Html.DisplayFor(model => model.Name)
    </dd>
</dl>
@*Modify the action url to your controller/action*@
<form action="home/delete?name=@Model.Name&id=@Model.Id" method="post">
    <input type="submit" value="Delete" class="btn btn-danger" /> |
    <a asp-action="Index">Back to List</a>
</form>

结果:

【讨论】:

    【解决方案2】:

    据我了解,您不能将 Model 属性从 ActionLink 发送到 POST 方法。

    例如,指向删除页面的索引页面上的 ActionLink。

    @Html.ActionLink("Delete", "Delete", new { id = item.TagId, name = item.Name })

    您只能传递给 GET 方法。

    对于 asp.net,显然 Model 属性(通过 ActionLink 发送到 Delete 页面)被自动绑定为查询参数,这意味着它可以在 POST 方法中访问。

    要对 asp.net core 做同样的事情,我相信我可以在 Posted 时将 Model 属性作为查询参数添加到 Form 中,如下所示:

    &lt;form asp-action="Delete" asp-route-name="@Model.Name"&gt; &lt;/form&gt;

    这会产生 html:

    &lt;form action="/Tag/Delete/9?name=Orange" method="post"&gt; &lt;/form&gt;

    然后可以在 POST 方法中访问

    public ActionResult Delete(int id, string name) { }

    @Brando Zhang 我在使用你的方法时遇到了问题,但我认为结果是一样的。

    【讨论】:

      猜你喜欢
      • 2021-06-06
      • 2021-06-05
      • 2021-09-06
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多