これを行う最も簡単な方法は、html ヘルパーを使用することです。画像ファイル名を表示する前にファイル システムをチェックするため、余分なパフォーマンス ヒットが発生することに注意してください。ただし、ヒットは小さいため、トラフィックが非常に多い場合を除き、問題に気付くことはありません。次に、何らかのキャッシュを実装して、ファイルが存在するかどうかをアプリが「認識」できるようにします。
カスタムhtmlヘルパーを使用できます
public static class ImageHtmlHelpers
{
public static string ImageUrlFor(this HtmlHelper helper, string contentUrl)
{
// Put some caching logic here if you want it to perform better
UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
if (!File.Exists(helper.ViewContext.HttpContext.Server.MapPath(contentUrl)))
{
return urlHelper.Content("~/content/images/none.png");
}
else
{
return urlHelper.Content(contentUrl);
}
}
}
次に、ビューで次を使用してURLを作成できます。
<img src="<% Html.ImageUrlFor("~/content/images/myfolder/myimage.jpg"); %>" />
編集: ジムが指摘したように、私は実際にはサイジングの問題に取り組んでいません. 個人的には、自動サイズ要求管理/サイズを使用しますが、これはまったく別の話ですが、フォルダー/サイズが心配な場合は、その情報を渡してパスを構築するだけです. 以下のように:
public static class ImageHtmlHelpers
{
public static string ImageUrlFor(this HtmlHelper helper, string imageFilename, ImageSizeFolderEnum imageSizeFolder)
{
UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
string contentUrl = String.Format("~/content/userimages/{0}/{1}", imageSizeFolder, imageFilename);
if (!File.Exists(helper.ViewContext.HttpContext.Server.MapPath(contentUrl)))
{
return urlHelper.Content(String.Format("~/content/userimages/{0}/none.png", imageSizeFolder));
}
else
{
return urlHelper.Content(contentUrl);
}
}
}
次に、ビューで次を使用してURLを作成できます。
<img src="<% Html.ImageUrlFor("myimage.jpg", ImageSizeFolderEnum.Small); %>" />
フォルダーが固定セットである場合は、プログラムによる制御を改善するために Enum を提案しましたが、迅速で厄介なアプローチのために、フォルダーがデータベースで生成された場合などに文字列を使用できない理由ではありません。