0

以前は少し違った方法でこの質問をしてみましたが、理解できなかったので、別の方法で試してみます。

いつものようにViewsディレクトリにビューがあるMVC3アプリケーションがあります。ただし、さまざまな理由から、各ビューの画像をビュー自体と同じフォルダーに配置する必要があります。つまり、私の場合は、Views / Manuals / en-US/nameなどです。

私が使用するルートは次のとおりです。

routes.MapRoute(
                "Parameter",
                "{controller}/{action}/{lang}/{prod}",
                new { controller = "Manuals", action = "Product", lang = "en-US", prod = "name" }
        );

さて、前述のように、このビューの画像を同じフォルダーに配置して、画像パスを単に「ATEXSymbol.svg」にする必要があります。

このルートがあり、画像にこのような単純な相対パスを使用すると、次のようなエラーが発生します。

ビュー'da-DK/ ATEXSymbol.svg'またはそのマスターが見つからなかったか、検索された場所をサポートするビューエンジンがありません。次の場所が検索されました:〜/ Views / Manuals / da-DK / ATEXSymbol.svg.aspx〜/ Views / Manuals / da-DK / ATEXSymbol.svg.ascx〜/ Views / Shared / da-DK/ATEXSymbol.svg。 aspx〜/ Views / Shared / da-DK / ATEXSymbol.svg.ascx〜/ Views / Manuals / da-DK / ATEXSymbol.svg.cshtml〜/ Views / Manuals / da-DK / ATEXSymbol.svg.vbhtml〜/ Views / Shared / da-DK / ATEXSymbol.svg.cshtml〜/ Views / Shared / da-DK / ATEXSymbol.svg.vbhtml

つまり、基本的には、正しい言語フォルダーで画像を検索しますが、製品名フォルダーの部分はなく、多数のビュー拡張機能の1つが追加されています。MVCが同じフォルダー内のこの相対パスを実際に予期していないことは知っていますが、ほとんど選択の余地はありません。手に負えない目的で、同じフォルダに画像を配置する必要があります。

では、どうすればこれを達成できますか?

編集:

実際、私は少し上で、パスの製品名の部分が欠落していると言って誤解しましたが、もちろんそうではありません。パスのその部分は、ビュー自体の名前です。したがって、基本的に、src属性の単純な相対パス(画像ファイルの名前のみ)によって取得されるパスは、画像の正しいパスを作成します。唯一の問題は、ビューファイル拡張子が追加されることです...

誰もがこれを解決する方法を知っていますか?

編集2:

ところで、私はUrl.Contentを使用できたかもしれませんが、何らかの理由でそれも機能しません。これを使用する場合:

<embed  type="image/svg+xml" src="@Url.Content("~/Content/images/da-DK/3153/CheckRotation.svg")"></embed>

...動作します...しかし、これを使用すると(同じことですが、Viewsフォルダーの画像を使用します)...

<embed  type="image/svg+xml" src="@Url.Content("~/Views/Manuals/da-DK/CheckRotation.svg")"></embed>

...動作しません。後者の例のパスをWebインスペクターで検査すると、正しいパス(localhost:49864 / Views / Manuals / da-DK / CheckRotation.svg)のように見えますが、見つからないというメッセージが表示されます。

編集3:

Thinking Sitesの回答は私に解決策を与えてくれました。ビュー自体に提案されたルートが必要だったので、少し変更する必要がありました。だから私はこのルートを追加しました:

routes.MapRoute(
                "Image",
                "{controller}/{action}/{lang}/{prod}",
                new { controller = "Manuals", action = "Image", lang = "en-US", prod = "name" }
        );

prodは実際には拡張子を含むファイル名全体を保持するようになったため、パスを少し調整しました(提案どおり)。

public ActionResult Image(string lang, string prod)
        {
            var root = Server.MapPath("~/Views/Manuals/");
            var filepath = Path.Combine(root, lang, prod); // whatever creates your path here.
            return File(filepath, "image/svg+xml");
        }

そして、ビューでは、次のようなパスを持つことができます。

<embed  type="image/svg+xml" src="@Url.Content("/Manuals/Image/da-DK/CheckRotation.svg")"></embed>
4

2 に答える 2

1

このルートの使用:

routes.MapRoute(
                "Parameter",
                "{controller}/{action}/{lang}/{prod}",
                new { controller = "Manuals", action = "Product", lang = "en-US", prod = "name" }
        );

コントローラー ManualsController でこのアクションを作成します

public ActionResult Product(string lang,string prod){
   var root = Server.MapPath("~/views/manuals/");
   var filepath = Path.Combine(root,lang,prod,".svg"); // whatever creates your path here.
   return File(filepath ,"your mime type");
}

カスタム ビュー エンジンは必要ありません。FileResult は、まさにこの機会のために設計されています。

于 2012-05-04T22:26:28.013 に答える
0

たぶんあなたの質問への答えはあなたのエラーにあります:

ビュー'da-DK/ ATEXSymbol.svg'またはそのマスターが見つからなかったか、検索された場所をサポートするビューエンジンがありません。

カスタムビューエンジンを接続することを考えましたか?

私は自分で作成したことがなく、ガイダンスを提供できないため、これは不完全な回答です(コメントによっては後で削除できます)。それは興味深い問題ですが、私が知る限り、ユニークな問題です。慣例によりそのように機能しないフレームワークの場合、アイテムを「まとめてダンプ」するように指示するのは誰だろうか。ただし、Webフォームを使用している場合は、非常に簡単です。

于 2012-05-04T17:28:40.047 に答える