【问题标题】:Previous GET parameters being unintentionally preserved in POST request以前的 GET 参数无意中保留在 POST 请求中
【发布时间】:2015-10-20 07:21:47
【问题描述】:

截至目前,我使用 GET 请求导航到一个视图,看起来像这样:

/batches/install?Id=2&ScheduledDate=07.29%3A12

从那里,我使用表单发送一个 POST 请求(我在其中包含我希望在请求中包含的数据。

此外,我将表单操作设置为“创建”,这是我希望将请求发送到的操作。

我的问题是发送此请求会在 POST url 中保留 GET 参数,使其看起来如下:

../batches/Create/2?ScheduledDate=07.29%3A12

我不想这样,因为:

1:看起来很奇怪

2:它发送我不打算在此请求中发送的数据

3:如果我的模型已经有一个名为“id”或“scheduledDate”的属性,则无意的 GET 参数将绑定到这些属性。

如何在我的新 POST 请求中忽略当前的 GET 参数? 我只想将表单 POST 数据发送到 url: ../批次/创建 (不带任何 GET 参数)

如何做到这一点?

根据要求,这是我的 POST 表单:

@using (var f = Html.Bootstrap().Begin(new Form("Create")))
{
  //inputs omitted for brevity

    @Html.Bootstrap().SubmitButton().Style(ButtonStyle.Success).Text("Create batch")
}

请注意,我使用 TwitterBootstrapMVC html 帮助程序 (https://www.twitterbootstrapmvc.com/),尽管这并不重要。

根据要求,总结一下:

我将获取请求发送到:/batches/install?Id=2&ScheduledDate=07.29%3A12。

通过返回的视图,我将 POST 请求发送到:/batches/create。

但是,之前的 get 参数包含在发出 POST 请求查询的 POST 请求 URL 中:/batches/Create/2?ScheduledDate=07.29%3A12(这不是预期的)。

【问题讨论】:

  • 请显示您的 POST 请求被触发的表单的 HTML 或 Razor。
  • @lbrahim 我在我的问题中包含了基本形式。
  • 不清楚您的要求。如果您发布表单,您应该重定向到另一个 GET 方法,这样就不会有参数。或者,如果您返回视图以更正验证错误,那么您为什么期望
  • @StephenMuecke 场景是:我将获取请求发送到:/batches/install?Id=2&ScheduledDate=07.29%3A12。通过返回的视图,我将 POST 请求发送到: /batches/create ,但是之前的 get 参数包含在 POST 请求 URL 中进行 POST 请求查询: /batches/Create/2?ScheduledDate=07.29%3A12 (不是打算。)。
  • 您在浏览器的地址栏中看到的是作为 GET(而不是 POST)结果生成的查询字符串参数。您需要展示您的 POST 方法以了解您真正在做什么

标签: asp.net-mvc http routing asp.net-mvc-5 asp.net-mvc-routing


【解决方案1】:

虽然这不是一个好主意,但会给你你想要的。

[HttpPost]
     public ActionResult Create() {
      //do whatever you want with the values
    return RedirectToAction("Create", "batches");
 } 

【讨论】:

  • 是的,我自己也有这种想法,但我想避免为这样一个看似简单的问题执行不必要的重定向。
【解决方案2】:

这是 MVC 的一个“功能”,之前被报告为错误 (issue 1346)。正如帖子中所指出的,有几种不同的解决方法:

  1. 使用命名路由以确保只有您想要的路由会被用来生成 URL(这通常是一种很好的做法,尽管在这种特定情况下没有帮助)
  2. 明确指定所有路由参数 - 甚至是您希望为空的值。这是解决这一特殊问题的一种方法。
  3. 您可以使用 Razor 的 ~/ 语法或调用 Url.Content("~/someurl") 来确保您尝试的 URL 不会发生额外(或意外)处理,而不是使用路由来生成 URL生成。

对于这种特殊情况,您可以在表单内使用空字符串显式声明参数。

@using (var f = Html.Bootstrap().Begin(new Form("Create").RouteValues(new { Id = "", ScheduledDate = "" })))
{
    //inputs omitted for brevity

    @Html.Bootstrap().SubmitButton().Style(ButtonStyle.Success).Text("Create batch")
}

【讨论】:

    猜你喜欢
    • 2015-08-04
    • 1970-01-01
    • 2013-04-17
    • 2011-12-16
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 2018-12-14
    相关资源
    最近更新 更多