我有一个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会更好无论本地文件夹设置如何,网址都能正常工作。
我确实试过“../a/b/c”和“/ a / b / c”,但似乎都没有效果。
提前感谢您的帮助!
答案 0 :(得分:11)
我个人倾向于在我的视图中使用服务器相对URL的全局变量,如:
var BASE_URL = '@Url.Content("~/")';
然后你可以做以下事情:
$.get(BASE_URL + 'a/b/c'), function (data) {}, "json");
我想补充一点,如果您希望它完全是全局的,您可以将其添加到/Views/Shared/_Layout.cshtml中。
答案 1 :(得分:3)
我遇到了同样的问题,最终创建了两个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');
答案 2 :(得分:3)
在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;
});