jQuery AJAX URL 不是亲戚
jQuery AJAX URL's not relative
我遇到了与 this 问题中所述相同的问题。在 MVC5 单页应用程序中,我的所有 AJAX 请求如下所示:
$.ajax({
type: 'GET',
url: 'ControllerName/MethodName',
data: {foo : 'bar'},
dataType: 'json',
cache: false,
})
如果我在我的应用程序的首页上,其中 URL 将是:
http://localhost:62989/
此 AJAX 方法将调用:
http://localhost:62989/ControllerName/MethodName
但是,当我在不同的页面上(有单元测试)时,例如:
http://localhost:62989/Home/UnitTests
此 AJAX 方法将调用:
http://localhost:62989/Home/ControllerName/MethodName
这是行不通的。将 'ControllerName/MethodName' 替换为:
'@Url.Action("MethodName", "ControllerName")'
对我不起作用。在 Firebug 中显示为:
GET http://localhost:62989/Home/@Url.Action(%22MethodName%20%22ControllerName%22)
并使用评论中的答案,即:
window.location.pathname + 'ControllerName/MethodName'
也不行。我做错了什么?
您不能在外部 javascript 文件中使用 @Url.Action("MethodName", "ControllerName")
。这仅适用于 Razor 视图。因此,例如在您的 Razor 视图中,您可以设置一个 javascript 变量:
<script type="text/javascript">
var myUrl = '@Url.Action("MethodName", "ControllerName")';
</script>
您可以在外部 js 中使用:
$.ajax({
type: 'GET',
url: myUrl,
data: {foo : 'bar'},
dataType: 'json',
cache: false,
});
显然,这很少是必要的,因为您在现有 DOM 元素(例如 HTML 表单或锚点)的某些事件的回调中编写了那些 AJAX 请求。因此,您已经在 DOM 元素中获得了有关 url 的所有必要信息。
假设您不引人注意地AJAX化锚元素:
@Html.ActionLink("click me", "MethodName", "ControllerName", new { foo = "bar" }, new { id = "myLink" })
所以你已经在这个锚点中有一个合适的 url,你可以 AJAXify:
$('#myLink').click(function() {
$.ajax({
type: 'GET',
url: this.href,
dataType: 'json',
cache: false,
});
return false;
});
请注意我是如何使用 this.href
从锚点中提取正确的 url 的。对于可以订阅 .submit
事件并提取 action
属性的表单元素也是如此。
如果由于某种原因你正在操纵一些没有 url 概念的 DOM 元素,你总是可以使用 HTML5 data-* 属性:
<div id="myDiv" data-url="@Url.Action("MethodName", "ControllerName")">click me</div>
然后在您单独的 js 文件中:
$('#myDiv').click(function() {
$.ajax({
type: 'GET',
url: $(this).data('url'),
dataType: 'json',
cache: false,
});
});
这几乎就是哲学 - 在 ASP.NET MVC 应用程序中处理 url 时始终使用服务器端助手。
我遇到了与 this 问题中所述相同的问题。在 MVC5 单页应用程序中,我的所有 AJAX 请求如下所示:
$.ajax({
type: 'GET',
url: 'ControllerName/MethodName',
data: {foo : 'bar'},
dataType: 'json',
cache: false,
})
如果我在我的应用程序的首页上,其中 URL 将是:
http://localhost:62989/
此 AJAX 方法将调用:
http://localhost:62989/ControllerName/MethodName
但是,当我在不同的页面上(有单元测试)时,例如:
http://localhost:62989/Home/UnitTests
此 AJAX 方法将调用:
http://localhost:62989/Home/ControllerName/MethodName
这是行不通的。将 'ControllerName/MethodName' 替换为:
'@Url.Action("MethodName", "ControllerName")'
对我不起作用。在 Firebug 中显示为:
GET http://localhost:62989/Home/@Url.Action(%22MethodName%20%22ControllerName%22)
并使用评论中的答案,即:
window.location.pathname + 'ControllerName/MethodName'
也不行。我做错了什么?
您不能在外部 javascript 文件中使用 @Url.Action("MethodName", "ControllerName")
。这仅适用于 Razor 视图。因此,例如在您的 Razor 视图中,您可以设置一个 javascript 变量:
<script type="text/javascript">
var myUrl = '@Url.Action("MethodName", "ControllerName")';
</script>
您可以在外部 js 中使用:
$.ajax({
type: 'GET',
url: myUrl,
data: {foo : 'bar'},
dataType: 'json',
cache: false,
});
显然,这很少是必要的,因为您在现有 DOM 元素(例如 HTML 表单或锚点)的某些事件的回调中编写了那些 AJAX 请求。因此,您已经在 DOM 元素中获得了有关 url 的所有必要信息。
假设您不引人注意地AJAX化锚元素:
@Html.ActionLink("click me", "MethodName", "ControllerName", new { foo = "bar" }, new { id = "myLink" })
所以你已经在这个锚点中有一个合适的 url,你可以 AJAXify:
$('#myLink').click(function() {
$.ajax({
type: 'GET',
url: this.href,
dataType: 'json',
cache: false,
});
return false;
});
请注意我是如何使用 this.href
从锚点中提取正确的 url 的。对于可以订阅 .submit
事件并提取 action
属性的表单元素也是如此。
如果由于某种原因你正在操纵一些没有 url 概念的 DOM 元素,你总是可以使用 HTML5 data-* 属性:
<div id="myDiv" data-url="@Url.Action("MethodName", "ControllerName")">click me</div>
然后在您单独的 js 文件中:
$('#myDiv').click(function() {
$.ajax({
type: 'GET',
url: $(this).data('url'),
dataType: 'json',
cache: false,
});
});
这几乎就是哲学 - 在 ASP.NET MVC 应用程序中处理 url 时始终使用服务器端助手。