我们如何使用Asp.net MVC引用页面的View文件夹中的.js文件

时间:2020-03-05 18:57:42  来源:igfitidea点击:

例如,如果我在Views / Home / Index.aspx中有一个页面,而在Views / Home / Index.js中有一个JavaScript文件,那么如何在aspx页面上引用呢?

即使编译器说路径正确,下面的示例也不起作用

<script src="Index.js" type="text/javascript"></script>

完全相同的问题已在此处更详细地发布:
http://forums.asp.net/p/1319380/2619991.aspx

如果目前无法做到这一点,将来还会吗?如果不是,那么每个人如何管理大型Asp.net MVC项目的javascript资源?我们是否只是在Content文件夹中创建一个与View文件夹结构类似的文件夹结构? UCK!

解决方案

回答

我们可以使用如下所示的VirtualPathUtility.ToAbsolute方法将.js文件的应用程序相对URL转换为可以写入页面的绝对URL:

<script type="text/javascript" src="<%=VirtualPathUtility.ToAbsolute("~/Views/Home/Index.js") %>"></script>

回答

我们应该为脚本使用单独的文件夹结构。例如,应用程序根目录下的JavaScript文件夹。使用视图存储js文件不仅会影响路径解析问题,还会影响安全性和权限精简。而且,如果将来决定将某些应用程序部件存储在专用子文件夹中时决定将它们分开部署,则以后将JS文件作为程序集资源嵌入起来要容易得多。

回答

对于共享的javascript资源,使用Content文件夹是有意义的。问题是我专门试图解决永远无法重用的aspx页面特定的javascript。

我想我要做的就是将特定于aspx页面的javascript放到页面本身上,并将共享的js资源保留在Content文件夹中。

回答

这是HtmlHelper的一个不错的扩展方法:

public static class JavaScriptExtensions
{
    public static string JavaScript(this HtmlHelper html, string source)
    {
        TagBuilder tagBuilder = new TagBuilder("script");
        tagBuilder.Attributes.Add("type", "text/javascript");
        tagBuilder.Attributes.Add("src", VirtualPathUtility.ToAbsolute(source));
        return tagBuilder.ToString(TagRenderMode.Normal);
    }
}

像这样使用它:

<%=Html.JavaScript("~/Content/MicrosoftAjax.js")%>