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

时间:2008-09-17 02:18:07

标签: c# javascript asp.net-mvc

例如,如果我有一个位于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文件夹结构的文件夹结构? YUCK!

5 个答案:

答案 0 :(得分:3)

您可以使用如下的VirtualPathUtility.ToAbsolute方法将.js文件的app relative url转换为可以写入页面的绝对url:

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

我认为我只需要将aspx页面特定的javascript直接放到页面本身上,并将共享的js资源保存在Content文件夹中。

答案 3 :(得分:1)

这是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")%>

答案 4 :(得分:0)

如果将页面重新路由到自定义RouteHandler,则可以在将RequestContext处理到MvcHandler类之前检查是否存在文件。

示例(未完成):

public class RouteHandler : IRouteHandler
{
    public IHttpHandler 
    GetHttpHandler(RequestContext requestContext)
    {
        var request = requestContext.HttpContext.Request;

        // Here you should probably make the 'Views' directory appear in the correct place.
        var path = request.MapPath(request.Path); 
        if(File.Exists(path)) {
            // This is internal, you probably should make your own version.
            return new StaticFileHandler(requestContext);
        }
        else {
            return new MvcHandler(requestContext);
        }
    }
}