3

イメージを生成する ASP.NET MVC コントローラーがあり (イメージはメモリに保存され、ハード ドライブには保存したくありません)、それらをビューに返す必要があります。

問題は、1 つのコントローラー メソッドから複数の画像を返す方法がわからないことです (画像を 1 つのビューに表示したい)。FileResultたとえば、単一の画像を返すことができることは知っていますが、同じメソッドから複数の画像を返す方法を (google/stackoverflow ではなく) 見つけることができません。メソッドを複数のメソッドに分割することはできません。ああ、すべての画像は に変換されbyte[]ますが、必要に応じて元に戻すことができます。

4

5 に答える 5

4

これは機能するはずです。私の例ではディスクから画像を読み取っていますが、メモリまたはどこからでも取得できることに注意してください。次に、クライアント側でjava-scriptを使用してそれらを表示します。

[HttpGet]
public JsonResult Images()
{
    var image1Base64 = Convert.ToBase64String(System.IO.File.ReadAllBytes(Server.MapPath("~/Images/1.jpg")));
    var image2Base64 = Convert.ToBase64String(System.IO.File.ReadAllBytes(Server.MapPath("~/Images/2.jpg")));

    var jsonResult = Json(new { image1 = image1Base64, image2 = image2Base64 }, JsonRequestBehavior.AllowGet);
    jsonResult.MaxJsonLength = int.MaxValue;

    return jsonResult;
}
于 2013-02-13T00:31:45.213 に答える
4

画像のMIMEタイプにアクセスできる場合は、別のコントローラーメソッドに別のリクエストを行う代わりに、いつでもBase64でエンコードされた画像としてレンダリングできます。これは私が使用するビューモデルです:

public class ImageViewModel
{
    public string FileName { get; set; }

    public string MIME { get; set; }

    public byte[] Data { get; set; }

    public override string ToString()
    {
        return string.Format(@"data:{0};base64,{1}", MIME.ToLower(), Convert.ToBase64String(Data));
    }
}

タグの属性でFilenameプロパティを使用できるため、ビューのマークアップとモデルバインディングは次のようになります(Razor構文を想定)。alt<img />

<img src="@model.ToString()" alt="@model.FileName" />

あなたは画像のキャッシュを失います、AFAIK-それは私にとっては問題ではありませんでしたが、当然のことながら一部の人にとっては大きな問題です。

于 2013-02-13T00:32:02.643 に答える
3

別の方法で解決できると思いますが、複数の画像を返す代わりに、コントローラに画像をロードするユーティリティ メソッドを作成できます。

public FileContentResult GetImage(int imageId)
{
  var image = GetImageById(imageId); // get from a list for example
  return File(image, "image/jpeg"); // your image Mime type
}

そして、View次のことができ、画像を繰り返します

@foreach (var image in Model)
{ 
<img alt="" src="@Url.Action("GetImage", "ControllerName", new {imageId =image.Id})"/>
}
于 2013-02-13T00:19:17.820 に答える
1

ユーザーの入力に基づいて複数の画像を表示したいが、ハードディスク (チャット) に保存したくない。そのため、セッション変数を使用してユーザー入力を保存することをお勧めします。また、FileResultそのセッション変数に基づいて複数の画像を簡単に返すことをお勧めします。

http://blog.theobjectguy.com/2009/12/session-with-style.html

于 2013-02-13T00:22:05.173 に答える