使用Ajax.BeginForm指定"GET"类型的提交

3

我的观点如下:

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>

@using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "Get", InsertionMode = InsertionMode.Replace, UpdateTargetId = "DisplayPatients" }))
{
    <input type="search" name="searchTerm" />
    <input type="submit" value="Do Search" />
}  

每当我尝试编译并查看获取的HTML页面的源代码时,我会看到:
<form action="/" data-ajax="true" data-ajax-method="Get" data-ajax-mode="replace" data-ajax-update="#DisplayPatients" id="form0" 
   method="post">    

但是,在我的Ajax.BeginForm中,我指定了HttpMethod = Get。尽管如此,输出的HTML页面中仍然是method = "post"

有任何想法吗?提前致谢。

编辑:

我甚至通过在浏览器中使用view-source查看了我的页面源代码。这显示:

<script src="/Scripts/jquery.unobtrusive-ajax.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js" type="text/javascript"></script>

<form action="/" data-ajax="true" data-ajax-method="Get" data-ajax-mode="replace" data-ajax-update="#DisplayPatients" id="form0" method="post">    <input type="search" name="searchTerm" />

(请注意,脚本(jquery-unobstrusive)实际上是存在的。)

2
它实际上是在进行POST请求还是GET请求。对于AJAX调用,表单的实际操作可能并不重要,它可能只使用data-ajax-method属性。 - Ben Robinson
@BenRobinson:我实际上想要进行一个“get”请求。这就是为什么我在我的Ajax.BeginForm中指定了HttpMethod =“Get”的原因。 - now he who must not be named.
1
@现在不得不提的人,他正在问你实际上正在进行什么请求?请考虑到AJAX调用是在JavaScript中完成的,因此它可以执行任何类型的方法 - Mike Perrenoud
@neoistheone:有道理,所以无论表单中的method操作是什么,请求类型始终从data-ajax-method中推断出来。如果是一个get请求,那么它总是一个get请求。 - now he who must not be named.
1
@nowhewhomustnotbenamed。是正确的,因为 JavaScript 确定了它实际请求的方式——在这种情况下,它使用该属性来进行确定。 - Mike Perrenoud
2个回答

7
在我的Ajax.BeginForm中,我指定了HttpMethod = Get。尽管如此,在输出的html页面中,我得到了method = "post"。
jquery.unobtrusive-ajax.js脚本忽略method属性,而使用data-ajax-method(如果有)。因此实际请求将是GET。请查看您的Google Chrome开发人员控制台的网络选项卡。

@Darin:感谢您澄清这一点。但即使如此,在执行时,控制权也会转移到带有 [HttpPost] 的操作方法上。当我点击提交按钮时,它不会进入带有 [HttpGet] 操作过滤器的操作方法。 - now he who must not be named.
@DarinDimitrov:但是,我看到我已经包含了那个Darin。请查看我的编辑。 - now he who must not be named.
2
你是否已经引入了 jquery.js?你在更新后的问题中展示了三个 JavaScript 引用,但如果你没有在它们之前引入 jquery.js,它们将无法工作。此外,请查看开发者工具栏的控制台选项卡以获取可能的 JavaScript 错误信息。 - Darin Dimitrov
@DarinDimitrov:谢谢,老兄。它像魔法一样奏效了。所以,现在我明白了,这些包含文件必须在它们之上有 jquery.js - now he who must not be named.
2
是的,它们是简单的jQuery插件。 - Darin Dimitrov
显示剩余6条评论

3
即使包含jQuery文件也可以正常工作,但我仍然认为在其中使用POST是不正确的。您可以通过在HTML属性中指定它来“覆盖”它:
@using (Ajax.BeginForm("Action", "Controller", null, new AjaxOptions { HttpMethod = "GET", InsertionMode = InsertionMode.Replace, UpdateTargetId = "results" }, new { @id = "search", @role = "search", @method="get" }))

您可以使用这个技巧将其设置为null或空白。仅供参考。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接