
Rezor PagesでWebサービスを作ろうとしています。
Postgresqlにbytea型で入っている画像データを表示しようとしています。
チュートリアルを見ながらなんとか作ってみて、デバッグ実行してブラウザに表示してみると、画像データが「25521625521906・・・」という長い数値で表示されました。
モデルでは
c#
1 public byte[] item_image { get; set; }
というプロパティになっているので、byte配列に入った画像データをそのまま表示したからこういう表示になったんだろうと思いました。
これを画像にしたいので、base64にすればよいだろうと思い、cshtmlを書き換えてみました。
元のcshtmlがこれです。
cshtml
1@page 2@model myService.Pages.Items.DetailsModel 3 4@{ 5 ViewData["Title"] = "detail"; 6} 7 8<h1>Detail</h1> 9 10<div> 11 <hr /> 12 <dl class="row"> 13 <dt class="col-sm-2"> 14 画像連番 15 </dt> 16 <dd class="col-sm-10"> 17 @Html.DisplayFor(model => model.image_tbl.item_image_id) 18 </dd> 19 <dt class="col-sm-2"> 20 画像 21 </dt> 22 <dd class="col-sm-10"> 23 <!-- ここを書き換え --> 24 @Html.DisplayFor(model => model.v_master.item_image) 25 <!-- ここを書き換え ここまで--> 26 </dd> 27 </dl> 28</div> 29<div> 30 <a asp-page="./Index">一覧に戻る</a> 31</div>
- 試行錯誤1
「ここを書き換え」の箇所を、以下のように書き換えてみました。
cshtml
1<img id="getimage" src="data: image;base64, @System.Convert.ToBase64String(model.v_master.item_image)" />
modelが存在しないというコンパイルエラーになりました。
- 試行錯誤2
そこでこのように書き換えてみました。
cshtml
1@Html.DisplayFor(model => System.Convert.ToBase64String(model.v_master.item_image))
コンパイルエラーは出ませんでしたが、デバッグ実行してみると、以下のようなエラーになりました。
An unhandled exception occurred while processing the request.
InvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
@Html.DisplayForに続けて関数を書くことはできないらしいと分かりました。
- 試行錯誤3
ではモデルの方で書き換えてしまえばよいのではとこのように書き換えてみました。
c#
1public byte[] _item_image; 2public byte[] item_image 3{ 4 get 5 { 6 string image64 = "data:image/jpeg;base64," + Convert.ToBase64String(_item_image); 7 return image64; 8 } 9 set { _item_image = value; } 10}
byte[]とstringの型違いでコンパイルエラーになりました。
- 試行錯誤4
ではメソッドを追加してしまえばいいのではと、モデルの方に関数を追加してみました。
c#
1public byte[] _item_image; 2public byte[] item_image 3{ 4 get { return _item_image; } 5 set { _item_image = value; } 6} 7public string GetItemImage() 8{ 9 return "data:image/jpeg;base64," + Convert.ToBase64String(_item_image); 10}
cshtmlでは関数の方を書いてみました。
cshtml
1@Html.DisplayFor(model => model.v_master.GetItemImage())
これもコンパイルエラーにはなりませんでしたが、デバッグ実行すると、さっきも見たエラーになりました。
An unhandled exception occurred while processing the request.
InvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
ここでお手上げになってしまいました。画像で表示するにはどうすればいいのでしょうか。
開発環境は以下の通りです :
・OS Windows10-64bit
・Visual Studio のバージョン 2019
・.NET Framework なのか Core のどっちかなのかとそのバージョン
プロジェクトのプロパティの「対象のフレームワーク」に「.NET core3.1」とあるのでこれだと思います。
・Visual Studio でプロジェクトを作る時に使ったテンプレートは何か
ロジェクトを作るときのウィザードの「新しいプロジェクトの作成」で、「ASP.NET Core Webアプリ サンプルのASP.NET Razor PagesコンテンツでASP.NET Coreアプリケーションを作成するためのプロジェクト テンプレートです」というのを選択しました。テンプレートとはこれのことでしょうか?




回答1件
あなたの回答
tips
プレビュー