【问题标题】:Routing document-relative static urls in MVC3在 MVC3 中路由文档相关的静态 url
【发布时间】:2015-01-02 17:39:46
【问题描述】:

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

【问题讨论】:

  • 明确一点:从~/Views/Home/Edit.cshtml 你想引用~/Scripts/Home/Edit/jslibrary/
  • 没关系,但理想情况下我希望~/Views/Home/Edit.cshtml 引用~/Scripts/jslibrary/——在 JS 库的路径中没有代表控制器/动作的目录。这样,可以从多个视图轻松引用 JS 库。问题是 JS lib 有内部相对引用,例如./somefile.js 当视图在路由 URL 下加载时,它成为 /Home/Edit/jslibrary/somefile.js 的引用,我需要将其重写为 /Scripts/jslibrary/somefile.js
  • Erm 那么是什么阻止您使用Url.Content 助手?喜欢<script type="text/javascript" src="@Url.Content("~/scripts/jslibrary/foo.js")"></script>?我不明白这里有什么问题。在您的问题中,您似乎在谈论一些图像。您在哪里以及如何引用这些图像?如果您从 CSS 中引用它们,只需使用相对(相对于 .css 文件)路径。如果您使用 <img> 标记从您的视图中引用它们,那么只需再次使用 Url.Content 帮助器。
  • @Darin,jslib 对 PNG 和其他 .JS 文件有脚本相关的引用。
  • 为什么不重新组织您的代码,以便将这些 url 作为参数从主视图传递?当前如何引用那些 PNG 和 JS 资源?目的是什么?

标签: asp.net-mvc-3 routes


【解决方案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...
}

不确定这个解决方案是否适合你,希望我能想出更优雅的东西。祝你好运!

【讨论】:

  • Christopher,我认为我无法完成这项工作——除了图像和扩展名之外,jslibrary 文件夹的根目录中还有其他文件,我必须单独捕获这些文件.我已经有了 IIS 重写规则,可以将对库中 imagesextensions 目录的调用更改为实际位置,但是松散的文件正在从裂缝中溜走,而使用 MVC 路由执行此操作的裂缝是相同的。但是,感谢您提供的链接——全局过滤器将对我正在处理的其他内容派上用场。所以,为此 +1!
  • 我同意,看来您真正需要的是使用 RegEx 来查找这些模式,然后简单地重写它们。这样做的好处是,一旦您修复了 JS 以与您的新支持架构配合得很好,就可以轻松删除。我不是 URL 重写方面的专家,但 this 似乎很有帮助?
【解决方案2】:

没有重写库并让它检查适当的目录,我能想到的唯一解决方案是将视图、库和支持文件包含在库可以访问的目录结构中。这当然会打破 MVC 对查找视图的配置方式的约定,因此您必须编写自定义覆盖 Razor 查找视图的方式,这不太复杂,但您可能会让自己的生活变得更加困难道路取决于您的应用程序。你的电话是两害相权取其轻 :) (我会去修图书馆)

【讨论】:

  • 是的,我认为你是对的。看起来没有办法使用默认视图分辨率来做到这一点。甚至不确定我能否想出一种新的方法来解决保留请求 URL 的视图,并且无论如何,它都会在很大程度上打破 MVC 约定。在短期内,我可能会将库托管在静态页面中,从长远来看,我会修补库以使用安装目录设置。
【解决方案3】:

制作帮助功能

@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/

【讨论】:

  • 谢谢——但我需要在路由级别处理这个问题。当我可以控制 URL 生成时,您的示例有效——但在我的情况下,URL 已经在 J​​avaScript 库中表示。我无法将它们输入此函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
相关资源
最近更新 更多