4

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

4

5 回答 5

3

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

<script type="text/javascript" src="<%=VirtualPathUtility.ToAbsolute("~/Views/Home/Index.js") %>"></script>
于 2008-09-17T02:23:29.450 回答
1

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

于 2008-09-17T02:26:30.707 回答
1

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

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

于 2008-09-17T03:49:10.883 回答
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")%>
于 2008-09-17T06:55:18.720 回答
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);
        }
    }
}
于 2011-11-11T13:32:14.933 回答