在MVC3中路由文档相对静态URL

时间:2012-08-02 17:29:02

标签: asp.net-mvc-3 routes

我正在将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。谢谢!)

3 个答案:

答案 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/