
[英]How do you pass “expensive” data from page to page using ASP.NET MVC 3?
[英]How do you reference .js files located within the View folders from a Page using 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!
您可以使用如下的VirtualPathUtility.ToAbsolute方法将.js文件的应用程序相对URL转换为可以写入页面的绝对URL:
<script type="text/javascript" src="<%=VirtualPathUtility.ToAbsolute("~/Views/Home/Index.js") %>"></script>
您应该为脚本分隔文件夹结构。 例如应用程序根目录下的JavaScript文件夹。 使用视图存储js文件不仅会影响路径解决问题,还会影响安全性和权限。 此外,如果您将JS文件作为程序集资源嵌入,如果您将来将它们存储在专用子文件夹中时将决定单独部署某些应用程序部件,则会更容易。
对于使用Content文件夹的共享javascript资源是有意义的。 问题是我特意试图解决的是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")%>
如果将页面重新路由到自定义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);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.