Ajax,asp.net mvc3路由和相对网址

时间:2012-05-24 14:43:31

标签: javascript jquery ajax asp.net-mvc-3 relative-path

我有一个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”,但似乎都没有效果。

提前感谢您的帮助!

3 个答案:

答案 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.ActionUrl.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;
});