【问题标题】:MVC3 deploy to a directory, url issueMVC3部署到目录,url问题
【发布时间】:2013-05-13 17:50:02
【问题描述】:

我有一个 mvc3 Web 应用程序,它将被部署到网站的目录中。应用程序的地址看起来像http://wwww.xx.com/aopo/。 aopo 是目录的名称。部署后我发现js文件中的url不再起作用。因为我已经用硬代码 url 编写了 js 代码,就像

$.ajax({url:"/employee/getemployee"})

在这种情况下,请求将被发送到http://wwww.xx.com/employee/getemployee 而不是http://wwww.xx.com/aopo/employee/getemployee,并返回 404。 js中有很多这样的代码。我不想修改js。有什么简单的方法可以让它工作吗?我可以在 global.asax.cs 中重写请求吗?

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    我相信您需要将您的 url 引用更改为:

    $.ajax({url:"@Url.Action("getemplotee","employee")"})
    

    如果这是一个脚本文件,您可以将正确的 URL 写入页面上的元素并读取:

    <div id='Main' data-url='@Url.Action("getemplotee","employee")' />
    

    然后在你的脚本中:

    $.ajax({url:$('#Main').data('url')})
    

    注意:

    There is lots of code in js like that. I don't want to modify the js
    

    我明白,但是您需要使用适当的辅助方法来解决在虚拟目录下运行的问题,因此我建议您硬着头皮以正确的方式进行修复。

    【讨论】:

    • 是的,我同意。这应该是一个正常的解决方案。
    【解决方案2】:

    一个不太干净的解决方案可能是,

    在布局中设置一个url前缀(在一个常见的地方),比如

    <script type="text/javascript">
        @{
            string root = Url.Content("~/");
            if (root.EndsWith("/", StringComparison.Ordinal))
            {
                root = root.Substring(0, root.Length - 1);
            }
        }
        window.URL_PREFIX = '@root';
    </script>
    

    然后使用ajaxSend钩子中的前缀并更改url。

    $(document).ajaxSend(function (event, jqxhr, settings) {
        if (window.URL_PREFIX && settings.url.indexOf(window.URL_PREFIX)) {
            settings.url = window.URL_PREFIX + settings.url;
        }
    });
    

    注意:如果在全局选项设置为 false 的情况下调用 $.ajax() 或 $.ajaxSetup(),则不会触发 .ajaxSend() 方法。

    这不是一个理想的解决方案,但在紧张的情况下可能会有所帮助。

    希望这会有所帮助。

    【讨论】:

    • 不客气,当您开始将所有 $.ajax({url:"/employee/getemployee"}) 更改为 $.ajax({url: window.URL_PREFIX +"/employee/getemployee"}) 时,此解决方案将使应用程序处于工作状态,并且当 js 文件中的所有 url 都更改时,您可以放弃 ajaxSend钩子。
    【解决方案3】:

    不,这是不可能的。由于请求未到达您的应用程序,因此您无法访问它,因此您无法重写它。

    如果您可以控制根站点,则可以使用 IIS 重写模块来重写您网站的 URL。

    【讨论】:

    • 那么您要么必须调整@asawyer 提到的所有调用,要么通过shakib 实施修复。我建议使用 Url.Action 方法清理您的解决方案。从长远来看,这将是最好的解决方案。
    猜你喜欢
    • 2011-06-12
    • 2015-04-21
    • 2021-05-29
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多