【问题标题】:@Url.Action("Action","Controller") calls both post and get method with same name@Url.Action("Action","Controller") 调用同名的 post 和 get 方法
【发布时间】:2019-01-10 08:10:45
【问题描述】:

我有一个控制器,其中有两个同名的操作方法,HttpPost 和 HttpGet 如下所示,当调用与@Url.Action("DoSomething","Controller") 的链接时,两个方法都被调用,我如何只调用 GET 方法?

有没有以@URL.Action 或任何其他方式传递类型 GET 或 POST?

[HttpGet]
public ActionResult DoSomething(int ? MyParam)
{

}

[HttpPost]
public ActionResult DoSomething(MyModel Model)
{

}

在 Razor 视图中当我建立类似的链接时

<a href="@Url.Action("DoSomething","Home",new { MyParam= Whatever})">JustDoIt</a>

然后它同时调用 POST 和 GET 方法,即使在将参数指定为 int 而不是模型之后也是如此

【问题讨论】:

  • 您如何使用@Url.Action()?如果它位于始终是 GET 请求的链接中。您可以在表单标签中发布,或通过 javascript 发布
  • Url.Action 只是 给你一个 URL - 一个字符串。它本身并没有调用任何东西。
  • 我们需要准确了解您在哪里使用它。 string 不会自己调用任何东西。请发帖minimal reproducible example

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


【解决方案1】:

尝试在表单声明中添加帖子:

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

或使用 HTML:

<form action="@Url.Action("DoSomething","Controller")" method="POST">
... 
</form>

HTTP 动词 POST/GET 会将您的请求路由到适当的操作。默认为 GET。

【讨论】:

  • 默认确实是GET。这意味着,如果他们使用默认值,他们就无法报告他们在问题中声称的症状
  • @Damien_The_Unbeliever 稍微编辑了我的问题,请看看它是否澄清。
  • @LearningPal 一个锚标签产生一个通过 GET 导航的链接。它不会调用您的 post 方法。如果您的 post 方法被调用,它来自表单提交,而不是锚导航。
【解决方案2】:

我认为您可能会将 Url.Action()Html.Action() 混淆(如果我错了,请道歉)。正如 cmets 中提到的那样,Url.Action() 将仅根据用于构建锚标记的参数呈现 URL。另一方面,Html.Action() 将在为服务器端的响应构建页面时调用一个操作,我猜这也是您所指的。

如果是这种情况,那么您需要通过指定路由值来为 DoSomething() 指定 Action 的参数,如下所示:

@Html.Action("DoSomething", "Home", new {MyParam = 2} )

DoSomething(int MyParam) 的结果将被注入到页面中。 Html.Action 不打算调用 POST,因此无法在使用 POST 动词修饰的 Action 上使用它。

【讨论】:

  • @Html.Action() 花费了很长时间,并且在我尝试在 for 循环中生成链接时也会使页面崩溃..
【解决方案3】:

问题是我还有一个 ajax 请求来检查页面是否已完全加载以显示进度条,当从布局中删除这部分代码时,它一直工作正常,没有调用任何操作方法两次。

【讨论】:

    猜你喜欢
    • 2016-12-22
    • 2016-09-24
    • 1970-01-01
    • 2018-06-04
    • 2014-08-03
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多