我有一个控制器,其中有两个与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而不是模型之后也是如此
尝试在表单声明中添加post:
@using (Html.BeginForm("DoSomething","Controller", FormMethod.Post))
{
}
或使用HTML:
<form action="@Url.Action("DoSomething","Controller")" method="POST">
...
</form>
HTTP谓词POST/GET将把您的请求路由到适当的操作。默认值为GET。
我认为您可能会将Url.Action()
与Html.Action()
混淆(如果我错了,请道歉(。正如有人在评论中提到的那样,Url.Action()
只会根据用于构建锚标记的参数来呈现URL。另一方面,Html.Action()
将在服务器端为响应构建页面时调用一个操作,我猜这也是您所指的。
如果是这种情况,那么您需要通过指定路由值来指定DoSomething()
的Action参数,如下所示:
@Html.Action("DoSomething", "Home", new {MyParam = 2} )
DoSomething(int MyParam)
的结果将被注入到页面中。Html.Action
不打算调用POST
,因此不可能在用POST
动词修饰的Action上使用它。
问题是我又收到了一个ajax请求,检查页面是否已完全加载以显示进度条,当从布局中删除该部分代码时,它一直运行良好,没有调用任何操作方法两次。