如何使用 Asp.net MVC 从页面引用位于视图文件夹中的 .js 文件

Posted

技术标签:

【中文标题】如何使用 Asp.net MVC 从页面引用位于视图文件夹中的 .js 文件【英文标题】:How do you reference .js files located within the View folders from a Page using Asp.net MVC 【发布时间】:2010-09-09 21:40:04 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我试过了,它似乎不起作用。它会生成我期望的正确 URL,但由于某种原因无法找到 js 文件。 你不能在那个位置引用一个 js 文件,因为 mvc 的配置阻止了它。您必须修改 web.config 文件以允许从该位置下载 js 文件。 ***.com/a/24763515/489000【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

我正在寻找与您相同的方法。除了填充页面或添加到内容目录之外,您是否发现了任何其他内容? 我今天也遇到了同样的问题。完全同意您在原始帖子中的“YUCK”。但是我认为把它放到页面本身就更恶心了!我的第一个想法是,可能是路由阻止了 Views 文件夹下的 js 文件被提供。你最后有没有成功解决这个问题?【参考方案4】:

这是一个很好的 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")%>

【讨论】:

【参考方案5】:

如果您将页面重新路由到自定义 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);
        
    

【讨论】:

以上是关于如何使用 Asp.net MVC 从页面引用位于视图文件夹中的 .js 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ASP.NET MVC 3 页面的 HTML 放入 QUnit 测试中? [复制]

如何从视图中排除 js 文件-asp.net mvc

如何查找从 ASP.NET MVC 页面单击的表格单元格值?

asp.net MVC - 我可以从类库中引用视图吗?

如何在 ASP.NET MVC 4 中为 CSP 使用动态随机数

ASP.NET MVC - 使用 C# 将引用不同程序集的模型从控制器传递到视图