当应用程序托管在IIS上的虚拟目录中时,如何将Request的ApplicationPath传递给Requirejs config.path的baseUrl?

Sid*_*dey 3 javascript iis asp.net-mvc requirejs

我有问题用requirejs运行我的asp.net mvc应用程序.下面我试着总结一下我在我的应用程序中定义的所有配置,比如文件结构,模块路径等.当app作为IIS中的父网站托管但在虚拟机托管时无法加载模块时,这种方法很有效.目录.

我的Web应用程序的文件结构是:

  • 网络/
    • 脚本/
      • app /(这是我的应用程序的js文件所在的位置)
        • common.js(所有视图的所有常见js代码都在这里)
        • navigation.js
        • 意见/
          • 帐户/
          • login.js
      • vendor /(这包含所有供应商特定的js文件)
        • 的jquery.js
        • domReady.js
      • main.js(requirejs配置文件)

以下是代码:

所有视图使用的主布局文件:

此脚本引用位于标题部分:

<script src="@Url.Content("~/Scripts/Vendor/require.js")"></script>
<script data src="@Url.Content("~/Scripts/main.js")"></script>
Run Code Online (Sandbox Code Playgroud)

main.js - 配置文件: 如下所示,baseurl是针对main.js配置文件设置的.

require.config({
    baseUrl: "../scripts",
    paths: {
        "common": "app/common",
        "jquery": "vendor/jquery-1.11.0",
        "domReady": "vendor/domReady-2.0.1",
        "sammy": "vendor/sammy-0.7.4",
        "jqueryui": "vendor/jquery-ui-1.10.4.min",
        "jquery.validate": "vendor/jquery.validate",
        "jquery.validate.unobtrusive": "vendor/jquery.validate.unobtrusive",
        "jquery.cookie": "vendor/jquery.cookie",
        "bootstrap": "vendor/bootstrap.min"
    },
    shim: {
        'sammy': ['jquery'],
        "jqueryui": {
            exports: "$",
            deps: ['jquery']
        },
        "jquery.validate": {
            deps: ['jquery']
        },
        "jquery.validate.unobtrusive": {
            deps: ['jquery', 'jquery.validate']
        },
        "jquery.cookie": {
            deps: ['jquery']
        },
        "bootstrap": {
            deps: ['jquery']
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

我正在尝试在其自己的单独文件中创建特定于视图的js代码.您可以在上面的文件结构中看到这一点,其中login.js用于login.cshtml,然后使用主布局文件.所以,要加载login.js,我在视图中使用它:

<script>
    require(["@Url.Content("~/Scripts/app/views/account/login.js")"], function() {});
</script>
Run Code Online (Sandbox Code Playgroud)

login.js中的代码如下:这有其登录视图特定代码,它还加载用common.js文件编写的代码.

 define(["common"],function ($) {
    // use [data-shell-spinner="generic"] on element to use it as a spinner.
    console.log("login view");
});
Run Code Online (Sandbox Code Playgroud)

基于以上配置,当此Web应用程序作为父目录托管在本地IIS上时,一切正常.

当同一个应用程序托管在本地IIS上的虚拟目录中时,我无法理解为什么会出现以下错误.我知道当渲染上面的login.cshtml时会发生这种情况:

GET http://localhost: 1045/scripts/app/common.js 404 (Not Found)
Uncaught Error: Script error for: common
Run Code Online (Sandbox Code Playgroud)

此应用程序的所有相同源文件都驻留在父应用程序下的vd虚拟目录中.路由,加载其他css,js,应用程序中使用的图像没有问题.

但是,即使应用程序托管在虚拟目录中,如何确保在main.js配置文件和加载视图特定文件中定义的所有路径都按预期工作?

ger*_*rod 6

尝试将其添加到" <head>主布局"页面中:

<base href="@(Request.ApplicationPath == "/" ? "/" : Request.ApplicationPath + "/")">
Run Code Online (Sandbox Code Playgroud)

这应该使所有脚本相对于基本路径加载,这应该正确解析到您的虚拟目录(或者如果您没有使用虚拟目录,则为网站根目录).

您可以在此处阅读有关base标签的更多信息.