POST请求

时间:2015-07-29 10:46:48

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

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

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

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

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

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

../批次/创建/ 2?ScheduledDate = 07.29%3A12

我不希望这样:

1:看起来很奇怪

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

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

如何在新的POST请求中忽略当前的GET参数? 我只想将表单POST数据发送到url: ../batches/create (没有任何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/),虽然这应该不重要。

根据要求,总结一下:

我发送了一个get请求:/batches/install?Id=2&ScheduledDate=07.29%3A12。

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

  
      
  1. 使用命名路由确保只使用您想要的路由来生成URL(这通常是一种很好的做法,尽管在这种特定情况下无效)
  2.   
  3. 明确指定所有路径参数 - 甚至是您想要为空的值。这是解决这一特定问题的一种方法。
  4.   
  5. 您可以使用Razor的〜/ syntax或调用Url.Content(“〜/ someurl”)来确保不会对您尝试的网址进行额外(或意外)处理,而不是使用路由来生成网址生成。
  6.   

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

@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")
}