MVC

时间:2018-10-02 15:30:46

标签: javascript asp.net-mvc

我正在尝试将this scanning软件整合到应用程序中。

包含所有必要的.js.css和二进制文件的文件夹称为Resources

在我的MVC应用程序中-我已将Resources文件放在我的Scripts文件夹中。

在我的.cshtml中,我有以下内容:

@section scripts {
    <script src="~/Scripts/Resources/dynamsoft.webtwain.config.js"></script>
    <script src="~/Scripts/Resources/dynamsoft.webtwain.initiate.js"></script>
}

成功加载脚本的人。

我面临的问题是脚本本身引用了Resources文件夹中的相对路径。

dynamsoft.webtwain.config.js中-您可以设置资源文件夹的路径-我将我的设置为以下内容:

Dynamsoft.WebTwainEnv.ResourcesPath = '~/Scripts/Resources';

但是,当页面加载时-我收到某些文件的404错误,因为它试图从字面上解释路径:

404 for resource files

我也尝试了以下方法,但是没有运气:

Dynamsoft.WebTwainEnv.ResourcesPath = '@Url.Content("~/Scripts/Resources")';

enter image description here

1 个答案:

答案 0 :(得分:1)

据我所知,您无法在单独的JS文件中使用以代字号(~)开头的相对路径,因为@Url.Content()助手和ASP.NET相对路径仅在Razor视图页面中起作用,但是您可以通过在JS 全局范围(即Razor视图页面的<script>标签)中创建根路径来传递相对路径,如下所示:

<script>
    var baseUrl = '@Url.Content("~")';
</script>

然后,您可以使用该变量将路径包含在JS文件中:

// custom JS file
if (typeof baseUrl !== 'undefined') {
    Dynamsoft.WebTwainEnv.ResourcesPath = baseUrl + '/Scripts/Resources';
}

或者只是提及完整路径并通过它:

@* Razor page *@
<script>
    var resourcesPath = '@Url.Content("~/Scripts/Resources")';
</script>

// custom JS file
if (typeof resourcesPath !== 'undefined') {
    Dynamsoft.WebTwainEnv.ResourcesPath = resourcesPath;
}

另一种替代方法是将自定义JS视图引擎与JS脚本的文件处理程序一起使用,如下例所示:

// custom JS engine
public class CustomJSEngine : BuildManagerViewEngine
{
    public CustomJSEngine()
    {
        ViewLocationFormats = new[]
        {
            "~/Scripts/{0}.js",
            "~/Scripts/Resources/{0}.js"
        };

        FileExtensions = new[]
        {
            "js"
        };
    }

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        var view = new RazorView(controllerContext, viewPath,
                                 layoutPath: masterPath, runViewStartPages: true, viewStartFileExtensions: FileExtensions,
                                 viewPageActivator: ViewPageActivator);
        return view;
    }
}

// put these lines below inside Application_Start()
RazorCodeLanguage.Languages.Add("js", new CSharpRazorCodeLanguage());
ViewEngines.Engines.Add(new CustomJSEngine());

// add this line if necessary
WebPageHttpHandler.RegisterExtension(".js");

参考文献:

@Url.Content in separate javascript file using ASPNET MVC 3 and Razor

Returning razor-parsed Javascript as a ViewResult from a controller