@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;”在控制器中创建空值的参数之间?