以前は少し違った方法でこの質問をしてみましたが、理解できなかったので、別の方法で試してみます。
いつものように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>