3

次を使用して、詳細ページ テンプレート内に byte[] 配列イメージを表示しようとすると:

public FileContentResult RenderPhoto(byte[] photo)
{
    // var array = (byte[])Session["photo"];
    // return File(array, "image/jpeg");

    return File(photo, "image/jpeg");
}

<img src="@Url.Action("RenderPhoto", Model.Photo)"/>

写真はヌルです。

Student.Photo をセッションに保存する場合:

//
// GET: /Student/Details/5

public ViewResult Details(int id)
{
    Student student = db.Students.Find(id);

    Session["photo"] = student.Photo;

    return View(student);
}

セッションから値を取得する画像を表示しようとします(上記のコメント行)。

最初のケースで null 値を取得するのはなぜですか?

Student を のビューに渡した後ViewResult Details(int id)Model.Photoその値はもう保持されませんか?

4

2 に答える 2

11

最初のケースでnull値を取得するのはなぜですか?

タグでサーバーにバイト配列を渡すことはできません<img>。タグは<img>、指定されたリソースにGETリクエストを送信するだけです。これを行う正しい方法は、idを使用することです。

<img src="@Url.Action("RenderPhoto", new { photoId = Model.PhotoId })" />

その後:

public ActionResult RenderPhoto(int photoId)
{
    byte[] photo = FetchPhotoFromDb(photoId);
    return File(photo, "image/jpeg");
}
于 2011-04-21T05:57:30.810 に答える
1

初めに

Url.Action("RenderPhoto", Model.Photo)

Model.Photo (おそらくバイト配列) は、ルート値を推測するオブジェクトとして扱われます。おそらく次の行に沿って、Array オブジェクトのパブリック プロパティを使用してルートを生成します。

?IsFixedSize=true&IsReadOnly=false&Length=255

それはかなり役に立たないURLになるでしょう。ページがブラウザーに読み込まれると、ブラウザーはその画像を要求し、RenderPhoto メソッドを呼び出しますが、写真と呼ばれるパラメーターがないため、バインディングは失敗し、そこに写真と呼ばれるパラメーターがあったとしても (AFAIK) ロジックはありません文字列からバイト配列を作成するための DefaultModelBinder。したがって、写真は null です。

あなたがする必要があるのは、Id プロパティを持つ匿名オブジェクトを Url.Action に渡すことです。

Url.Action("RenderPhoto", new { Id = Model.PhotoId })

これは、おそらく次の行に沿ってクエリ文字列に変換されます(ただし、ルートによって異なります)

/xxx/RenderPhoto/25

次に、RenderPhoto メソッドで写真のデータを取得する必要があります。

マーティン

于 2011-04-21T06:14:44.860 に答える