我正在将JavaScript库集成到ASP.NET MVC3 Web应用程序中。该库假定它将安装在引用它的页面旁边,因此它使用文档相对URL来查找其组件。
例如,默认目录布局类似于
container-page.html
jslibrary/
library.js
images/
icon.png
extensions/
extension.js
extension-icon.png
但是,我想从/Home/edit
中的视图引用该库。我在默认的Scripts\jslibrary\
中安装库当我在Views\Home\edit.cshtml
的视图中引用库时,库的文档相对链接如
images/icon.png
最终作为
的请求http://localhost/Home/images/icon.png
导致文件未找到(404)错误。如何构建寻找路径
{anyControllerName}/images/{anyRemainingPathInfo}
并提供
http://localhost/Scripts/jslibrary/images/{anyRemainingPathInfo}
?
(完全披露:我仍然在生产中的IIS 6,并且很快就没有机会去IIS7了,所以如果在IIS级别做得更好,请考虑IIS6。谢谢!)
答案 0 :(得分:1)
您可以创建一个控制器来处理重定向逻辑 - 例如“图像”控制器。使用模式在Global.asax文件中注册全局路由(有关此类模式的更多信息here:
routes.MapRoute(
"Images", // Route name
"{xyz}/{controller}/{path}", // URL with parameters
new {controller = "Images", action = "Index", path= UrlParameter.Optional} // Parameter defaults);
在你的控制器中:
public ActionResult Index(string path)
{
//format path, parse request segments, or do other work needed to Id file to return...
return base.File(path, "image/jpeg"); //once you have the path pointing to the right place...
}
不确定此解决方案是否适合您,希望我能想出更优雅的东西。运气最好!
答案 1 :(得分:0)
如果没有重写库并让它检查相应的目录,我能想到的唯一解决方案是将视图,库和支持文件包含在库可以访问的目录结构中。这当然会打破MVC关于查找视图的配置方式的约定,所以你必须编写Razor查找视图的方式的自定义覆盖,这不是太复杂,但你可能会让自己的生活变得更加困难这条路取决于你的应用。你的电话是两个邪恶中较小的一个:)(我会去修理图书馆)
答案 2 :(得分:0)
提供帮助功能
@functions{
public string AbsoluteUrl(string relativeContentPath)
{
Uri contextUri = HttpContext.Current.Request.Url;
var baseUri = string.Format("{0}://{1}{2}", contextUri.Scheme,
contextUri.Host, contextUri.Port == 80 ? string.Empty : ":" + contextUri.Port);
return string.Format("{0}{1}", baseUri, VirtualPathUtility.ToAbsolute(relativeContentPath));
}
}
调用
@AbsoluteUrl("~/Images/myImage.jpg") <!-- gives the full path like: http://localhost:54334/Images/myImage.jpg -->
这个例子来自 https://dejanvasic.wordpress.com/2013/03/26/generating-full-content-url-in-mvc/