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();
}

このメソッドは、ルートで定義されている uniqueId に対応する名前を持つ /App_Data/Books ディレクトリのサブディレクトリから index.htm ファイルを正しく提供します。ただし、ブラウザは元の URL の場所 (例: http://localhost/3Yru3/ )でそれらを見つけようとするため、index.htm ファイル内の CSS および画像ファイルは見つかりません。

これについて私にできることはありますか?私はおそらく何かを見落としていますか?

編集(私の質問への回答にある私のコメントも参照してください):
本はHTMLファイルとして保存されます(MVCビューとしてではなく、CSSと画像を参照する問題が少なくなります)。理由:
1.それらはアップロードされますユーザーによってそのように。
2. index.htm ファイルとそれが使用するリソースを HTML5 appcache に保存して、オフラインで使用できるようにしたいと考えています。

EDIT 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

私の問題に対する非常にエレガントな解決策を見つけたかもしれないと思いますが、それについてどう思うか、あなたから聞きたいです。App_Data サブフォルダー内の index.htm ファイルによって参照される CSS ファイルと画像ファイルを取得しようとするときに、ブラウザーを正しい場所に送信しようとする際に、「従来の」URL 書き換えを調べてきました (これは、長い文章ですが、意味があるといいのですが;-)。

最初に、アプリの global.asax.cs の BeginRequest イベント ハンドラーで Context.RewritePath を使用しようとしました。それはいくつかの予期しない副作用をもたらしました。次に、上記の質問で説明した元のルートと、CSS および画像ファイル リクエストの URL 書き換えの両方をカバーするカスタム ルートクラスを作成しました。カスタム ルートは、これらの要求中に Request.UrlReferrer プロパティに index.htm ファイルの場所の URL が含まれているという事実を利用します。これは非常に長い話になるので、技術的な詳細については、このテーマについて書いたブログ投稿を参照してください。この情報が他の人の貴重な時間を節約できることを願っています。

于 2012-04-07T08:35:36.597 に答える
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 に答える