[英]Ajax, asp.net mvc3 routes and relative urls
我有一个ASP.NET MVC3应用程序发布到这样的URL:
http://servername.com/Applications/ApplicationName/
在我的代码中,我使用jquery ajax请求,如下所示:
$.get(('a/b/c'), function (data) {}, "json");
当我在本地运行应用程序时,ajax请求直接转到正确的页面(是一个mvc路由),因为本地页面以“/”( localhost/a/b/c
)结尾。
但是,当我发布到http://servername.com/Applications/ApplicationName/
,尾随的“/”并不总是存在。 该网址可能是http://servername.com/Applications/ApplicationName
,然后会导致ajax请求尝试加载http://servername.com/Applications/ApplicationNamea/b/c
,但由于显而易见的原因而失败。
我已经考虑过重写url以附加一个尾随斜杠,但是A)它没有用,而且B)我觉得这个问题很难解决,并且配置javascript url工作会更好正确无论本地文件夹设置如何。
我确实试过“../a/b/c”和“/ a / b / c”,但似乎都没有效果。
先谢谢您的帮助!
就个人而言,我倾向于在我的视图中使用服务器相对URL的全局变量,如:
var BASE_URL = '@Url.Content("~/")';
然后你可以做以下事情:
$.get(BASE_URL + 'a/b/c'), function (data) {}, "json");
我想补充一点,如果你想让它完全全局化,你可以将它添加到你的/Views/Shared/_Layout.cshtml中。
我遇到了同样的问题,最终创建了两个JavaScript函数,它们反映了MVC Url帮助器方法Url.Action
和Url.Content
。 这些函数在_Layout.cshtml文件中定义,因此可用于所有视图,无论应用程序是在localhost的根目录中还是在服务器的子文件夹中,都可以正常工作。
<script type="text/javascript">
function UrlAction(action, controller) {
var url = ('@Url.Action("--Action--","--Controller--")').replace("--Action--", action).replace("--Controller--", controller);
return url;
}
function UrlContent(url) {
var path = "@Url.Content("~/--file--")";
path = path.replace("--file--", url.replace('~/', ''));
return path;
}
</script>
然后可以像这样调用它们:
var url = UrlAction('AvailableAssetClasses', 'Assessment');
var url2 = UrlContent('~/Images/calendar.gif');
在ASP.NET MVC应用程序中生成URL时始终使用Url助手,并且永远不要对它们进行硬编码。 因此,如果此脚本直接位于视图内:
<script type="text/javascript">
var url = '@Url.Action("a", "b")';
$.get(url, function (data) {}, "json");
</script>
如果这个脚本在一个单独的javascript文件(应该是)里面,你无法访问服务器端帮助程序,你可以简单地将url放在一些相关的DOM元素中。 例如,使用HTML5 data- *属性:
<div data-url="@Url.Action("a", "b")" id="foo">Click me</div>
然后在你的javascript文件中:
$('#foo').click(function() {
var url = $(this).data('url');
$.get(url, function (data) {}, "json");
});
如果你不引人注目地AJAX化锚或表格,那么你已经有了网址:
$('a#someAnchor').click(function() {
var url = this.href;
$.get(url, function (data) {}, "json");
return false;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.