3

我有一个 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/,尾随的“/”并不总是存在。url 可能是http://servername.com/Applications/ApplicationName,然后导致 ajax 请求尝试加载http://servername.com/Applications/ApplicationNamea/b/c,由于明显的原因而失败。

我已经研究过重写 url 以附加一个斜杠,但是 A)它没有用,并且 B)我觉得这是一个糟糕的解决问题的方法,最好配置 javascript url 来工作无论本地文件夹设置如何。

我确实尝试过“../a/b/c”和“/a/b/c”,但似乎都不起作用。

在此先感谢您的帮助!

4

3 回答 3

11

就我个人而言,我倾向于在我的视图中使用服务器相对 URL 的全局变量,例如:

var BASE_URL = '@Url.Content("~/")';

然后您可以执行以下操作:

$.get(BASE_URL + 'a/b/c'), function (data) {}, "json");

我想补充一点,如果您希望它完全是全球性的,您可以将其添加到您的 /Views/Shared/_Layout.cshtml 中。

于 2012-05-24T14:50:57.040 回答
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');
于 2012-05-24T14:49:22.170 回答
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 化,那么您已经有了 url:

$('a#someAnchor').click(function() {
    var url = this.href;
    $.get(url, function (data) {}, "json"); 
    return false;
});
于 2012-05-24T14:49:54.523 回答