【问题标题】:Setting up a common route for javascript calls in ASP.NET MVC project在 ASP.NET MVC 项目中为 javascript 调用设置公共路由
【发布时间】:2012-10-26 22:28:35
【问题描述】:

我的 ASP.NET MVC 项目有一个奇怪的路由问题,希望你们能帮助我。

总体而言,当我在本地主机上运行项目或在服务器上运行它时,它直接部署在http://myServerName 上时一切正常。当我将应用程序部署到位于不同虚拟目录下的服务器上的各种环境时,问题就开始了。例如:http://myServerName/QaEnviornmenthttp://myServerName/TestEnviornment

问题是对应用程序 URL 的所有 Javascript 调用都会忽略我的环境虚拟目录并失败。 例如,在我的 QA 服务器上,每当我必须进行 Ajax 调用时,我都会采用标准方法,例如:

var myUrl = '/ControllerName/ActionMethodName/'
$.ajax({url:myUrl,success:function(){Do stuff} })

因为我的应用程序部署在 http://myServerName/QaEnviornment 上,所以在渲染时我希望 myUrl 为 http://myServerName/QaEnviornment/ControllerName/ActionMethodName。相反,它会返回 as http://myServerName/ControllerName/ActionMethodName 并且当然会失败。

为了暂时解决这个问题,我声明了一个包含环境文件夹名称的全局 Javascript 变量,当我为 javascript 调用构建 URL 时,我必须记住始终将它们构造为 var myUrl = myGlobalFolderVar + '/ControllerName/ActionMethodName/'

使用全局 JavaScript 变量来解决这个问题对我来说似乎是一个糟糕的解决方案。我可以做些什么来使路由正常工作,以便每当进行 JavaScript 调用时,应用程序在其下运行的任何子文件夹始终包含在 URL 中?

【问题讨论】:

    标签: javascript asp.net-mvc deployment asp.net-mvc-routing url-routing


    【解决方案1】:

    不必总是记住正确构造它们,而是创建一个您调用的辅助函数来创建您的网址

    function CreateUrl(string path){
        return myGlobalFolderVar + path;
    }
    

    回答你的第二个问题,不是真的。路由不知道是什么发出了请求,您不能总是依赖 X-Http-RequestedWith 标头来做出决定。此外,您的站点应用程序根不在域根目录中,因此路由只会在访问您的应用程序时启动。我知道的唯一另一种方法是让 MVC 实际为您生成 Url (var url = '@Url.RouteUrl(params)';),但是当您将 JavaScript 放在一个或几个 .js 文件中时,这根本没有帮助。

    编辑

    上述函数是一个 JavaScript 函数,可以放在应用程序中的任何位置,包括外部 JS 文件。至于设置您的 myGlobalFolderVar,您可以通过几种方式进行设置。

    1.实际上在你的外部JS文件中硬编码变量。

    var myGlobalFolderVar = 'TestEnviornment';
    

    但是,如果您要部署到多个不同的测试服务器,这很难。

    2.如果您使用 web.config 转换,您可以根据构建类型在 web.config 转换中添加 AppSettings 键/值对。然后,使用该值,在母版页布局/视图中设置全局 Javascript 变量。

      <appSettings xdt:Transform="Replace">
        <add key="folderLocation" value="TestEnvironment" />
      </appSettings>
    

    在你的外部 JS 文件中

    //this makes it a site wide/global variable in any place you 
    //include your external JS file
        var myGlobalFolderVar = '';
    

    在你的主视图中

    <script type="text/javascript">
       myGlobalFolderVar = '@ConfigurationManager.AppSettings["folderLocation"]'
    </script>
    

    3. 与第二个相同,但使用 URL 助手来确定应用程序在主视图中的路径,而不是使用 web.config 转换

    <script type="text/javascript">
        myGlobalFolderVar = '@Url.Content("~/")'
    </script>
    

    基本思想是使用 .NET 找出它所在的位置并使用该路径信息设置一个全局 JavaScript 变量。然后,结合此答案顶部提供的辅助 JavaScript 函数,您可以在整个应用程序中根据需要正确生成路径 - 无论路径深度、部署位置或任何其他部署类型问题如何。

    var myUrl = CreateUrl('/ControllerName/ActionMethodName/');
    $.ajax({url:myUrl,success:function(){Do stuff} });
    

    【讨论】:

    • 这只有在 Javascript 代码内置在 Views 中时才有效,对吧?如果脚本存储在包含的外部 .js 文件中,这将无法使用,对吗?不过感谢您的回复!
    • 是的 - 如果您将上面的函数(它是 JS 不是 c#)放在外部 JS 文件中,它将在任何地方都可用。您可以像任何其他 JS 函数一样调用它。注意 -> 这不会进入 document.ready 类型处理程序,而是独立的。
    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 2018-02-13
    • 2016-06-10
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    相关资源
    最近更新 更多