1

在我的 ASP.NET MVC (3) 应用程序中,我在 global.asax.cs 中设置了以下路由:

routes.MapRoute(
    "UniqueId",
    "{uniqueId}",
    new { controller = "Book", action = "DownloadBook" },
    new { uniqueId = "[0-9a-zA-Z]{5}" }
);

DownloadFile 操作方法是:

public ActionResult DownloadBook(string uniqueId)
{
    string path = Server.MapPath(String.Format("~/App_Data/Books/{0}/index.htm", uniqueId));
    if (System.IO.File.Exists(path))
    {
        return File(path, "text/html");
    }
    return new EmptyResult();
}

该方法正确地为 /App_Data/Books 目录中的子目录中的 index.htm 文件提供服务,该文件的名称与路由中定义的 uniqueId 对应。但是,无法找到 index.htm 文件中的 CSS 和图像文件,因为浏览器会尝试在原始 URL 位置(例如http://localhost/3Yru3/)中找到它们。

对此我能做些什么吗?我可能忽略了什么?

编辑(另请参阅我的问题答案中的评论):
这些书籍存储为 HTML 文件(而不是 MVC 视图,这将使引用 CSS 和图像不成问题),因为:
1. 它们将被上传像这样的用户。
2. 我想将 index.htm 文件及其使用的资源存储在 HTML5 appcache 中,以便离线使用。

编辑 2我找到了解决我自己问题的方法,并想知道您对此有何看法。在下面的答案中查看我自己的答案。

4

3 回答 3

2

这一定会发生,因为您以错误的方式(相对)引用您的文件,这意味着它将根据您当前页面的根目录提供服务。

前任:

<link rel="Stylesheet" href="/Styles/site.css" />

或者

<link rel="Stylesheet" href="../../Styles/site.css" />

而不是这种方式,使用以下语法来链接你的 CSS 文件和你的图像

<link rel="Stylesheet" href="<%=Url.Content("~/Styles/site.css")%>" />

这应该可以正常工作,并且可以从任何页面正确评估,无论其位置如何。

于 2012-04-04T15:26:41.537 回答
0

你可以做一些事情,但它更像是一种黑客行为。为 css 链接放置占位符,然后在提供文件时进行替换,类似这样。

public ActionResult DownloadBook(string uniqueId)
{
string path = Server.MapPath(String.Format("~/App_Data/Books/{0}/index.htm", uniqueId));
if (System.IO.File.Exists(path))
{
   var file=File.ReadAllText(path);
   //this needs a bit more refining, it's just a proof of concept
     //you can use Razor templating, there is a library for that
    file=file.Replace("{CssHref}",UrlHelper.GenerateContentUrl("~/Content/site.css",HttpContext));
   return Content(file);
}
return new EmptyResult();
}
于 2012-04-04T19:20:21.650 回答
0

我想我可能已经找到了一个非常优雅的解决我的问题的方法,但我想听听你的看法。当它尝试获取 App_Data 子文件夹中 index.htm 文件所引用的 CSS 文件和图像文件时(已成为长句,我希望它有意义;-)。

首先,我尝试在应用程序的 global.asax.cs 的 BeginRequest 事件处理程序中使用 Context.RewritePath。这产生了一些意想不到的副作用。然后我创建了一个自定义路由类,它涵盖了我上面的问题中描述的原始路由以及 CSS 和图像文件请求的 URL 重写。自定义路由使用的事实是,在这些请求期间,Request.UrlReferrer 属性包含 index.htm 文件位置的 URL。由于这将成为一个很长的故事,因此我参考了我就该主题撰写的一篇博客文章以了解技术细节。我希望这些信息可以为其他人节省一些宝贵的时间。

于 2012-04-07T08:35:36.597 回答