6

asp.net mvc プロジェクトがあります。特定のビューでは、プロジェクト内の異なるフォルダーから 4 つの画像を呼び出します。

時々画像が見つかりません。4つのフォルダーすべてに異なるサイズの画像が含まれているため、フォルダーごとに画像を設定したいので、フォルダーごとに特定のサイズの画像を設定する必要があります。

画像がそれを行う方法が見つからないときにデフォルトの画像を表示する方法.iは、ビューで呼び出した画像がディレクトリにないときにnone.pngを呼び出すことを意味します。

画像が見つからない場合に画像を表示する方法はありますか。

asp.net 4 MVC 3でそれを行う方法は何でも.web.configを使用するか、他のものを設定します。

4

4 に答える 4

7

これを行う最も簡単な方法は、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 を提案しましたが、迅速で厄介なアプローチのために、フォルダーがデータベースで生成された場合などに文字列を使用できない理由ではありません。

于 2011-03-05T07:03:59.230 に答える
1

MVCについてはあまり知りませんが、それでも私の考えは次のとおりです。

ロジックに基づいて画像をフェッチする特定のコントローラーを用意します。マイケルが言ったように、監査が成功すると何か (画像) が返されます。つまり、画像が見つかった場合です。見つからない場合は、ステータス コード 404 などを返します。

残りはクライアントで JavaScript を介して処理します。そのため、img タグに onerror イベント用の何かを記述します。img ソースを、画像が見つからないポスター画像ファイルに置き換えることができます。ここでは、jquery を使用してそれを行う方法を多少 (正確ではありません) 示します。

$(function(){
    $('#myimg').error(function(){
        $('#result').html("image not found");
    });
});

PS: http://jsfiddle.net/Fy9SL/2/ jquery コードの完全なデモに興味がある場合。

于 2011-03-05T06:33:45.440 に答える
1
    public static MvcHtmlString Image(this HtmlHelper helper, string src, string alt)
    {
        var builder = new TagBuilder("img");

        // 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(src)))
        {
            src = urlHelper.Content("~/content/images/none.png");
        }
        else
        {
            src = urlHelper.Content(src);
        }

        builder.MergeAttribute("src", src);
        builder.MergeAttribute("alt", alt);
        return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing));
    }
于 2011-06-23T09:13:17.080 に答える
0

コントローラ アクションが を返すようにし、イメージ パスを記述するFileResulttype のパラメータを受け入れることができます。string

コントローラー アクションは、ディスクからイメージをロードして として返そうとしFileResultます。ファイルがディスクにない場合は、代わりにプレースホルダー 'image not found' イメージを返します。

次に、画像 (またはそのプレースホルダー) を表示するsrcには、要素の属性をimg画像ではなくコントローラー アクションに設定します。

于 2011-03-05T06:18:32.793 に答える