@Url.Action("Action","Controller") 调用同名的 post 和 get 方法

Posted

技术标签:

【中文标题】@Url.Action("Action","Controller") 调用同名的 post 和 get 方法【英文标题】:@Url.Action("Action","Controller") calls both post and get method with same name 【发布时间】: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 【参考方案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 请求来检查页面是否已完全加载以显示进度条,当从布局中删除这部分代码时,它一直工作正常,没有调用任何操作方法两次。

【讨论】:

以上是关于@Url.Action("Action","Controller") 调用同名的 post 和 get 方法的主要内容,如果未能解决你的问题,请参考以下文章

页面加载时,@Url.Action 在 javascript 中为 null 或 ""

尝试创建友好且“可破解”的 url 时使用 Url.Action() 时遇到问题

@Url.Action 添加“amp;”在控制器中创建空值的参数之间?

剃刀页面视图模型类中的 Url.Action 备用

使用 Url.action() 传递动态 javascript 值

如何在 Url.Action 中发送多个参数?