C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: ASP MVC IEnumerableメンバーの表示


(過去ログ 140 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■82261 / inTopicNo.1)  ASP MVC IEnumerableメンバーの表示
  
□投稿者/ yapii (9回)-(2016/12/26(Mon) 10:00:59)

分類:[.NET 全般] 

Visual Studio Community 2015 Fw4.6 C# です。

モデルのIEnumerableのメンバーのDisplayNameの出力方法がわかりません。
ビューの★部分です。

ご教示お願いいたします。


モデル
------------------- 
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace WebMvc_CSharp.Models
{
    public class TestViewModel
    {
        public string Title { get; set; }
        public HedModels Hed { get; set; }
        public IEnumerable<BodyModels> Body { get; set; }
    }

    public class HedModels
    {
        [Display(Name = "ヘッダNo")]
        public int ID { get; set; }
        [Display(Name = "ヘッダ名称")]
        public string Name { get; set; }
    }

    public class BodyModels
    {
        [Display(Name = "明細No")]
        public int ID { get; set; }
        [Display(Name = "明細名称")]
        public string Name { get; set; }
    }
}

コントローラー
------------------- 
using System.Collections.Generic;
using System.Web.Mvc;


namespace WebMvc_CSharp.Controllers
{
    public class TestController : Controller
    {
        public ActionResult Index()
        {
            var vmdl = new Models.TestViewModel();
            vmdl.Title = "Multi Model Sample";
            vmdl.Hed = new Models.HedModels(){ ID = 1, Name = "HeaderA" };
            vmdl.Body = new List<Models.BodyModels>()
            {
                new Models.BodyModels { ID = 1, Name = "BodyA" },
                new Models.BodyModels { ID = 2, Name = "BodyB" },
                new Models.BodyModels { ID = 3, Name = "BodyC" },
                new Models.BodyModels { ID = 4, Name = "BodyD" },
                new Models.BodyModels { ID = 5, Name = "BodyE" }
            };
            return View(vmdl);
        }
    }
}

ビュー
------------------- 
@model WebMvc_CSharp.Models.TestViewModel


<h2>@Html.DisplayFor( mdl => mdl.Title)</h2>

<dl>
    <dt>@Html.DisplayNameFor(mdl => mdl.Hed.ID)</dt>
    <dt>@Html.DisplayFor(mdl => mdl.Hed.ID)</dt>
    <dt>@Html.DisplayNameFor(mdl => mdl.Hed.Name)</dt>
    <dt>@Html.DisplayFor(mdl => mdl.Hed.Name)</dt>
    <dt>明細データ</dt>
    <dd>
        <table>
            <tr><th>@Html.DisplayNameFor(★ここがわからない★)</th><th>@Html.DisplayNameFor(★ここがわからない★)</th></tr>
            @foreach (var b in Model.Body)
            {
                <tr><td>@Html.DisplayFor(mdl => b.ID)</td><td>@Html.DisplayFor(mdl => b.Name)</td></tr>
            }
        </table>
    </dd>
</dl>

引用返信 編集キー/
■82263 / inTopicNo.2)  Re[1]: ASP MVC IEnumerableメンバーの表示
□投稿者/ WebSurfer (1101回)-(2016/12/26(Mon) 12:51:17)
No82261 (yapii さん) に返信

試してないのでハズレかもしれませんが・・・

@Html.DisplayFor の方は正しく表示されているのであれば、ヘッダは以下のようにす
ればよさそうな気がします。

<tr><th>@Html.DisplayNameFor(mdl => b.ID)</th><th>@Html.DisplayNameFor(mdl => b.Name)</th></tr>

ダメならその旨連絡ください。

引用返信 編集キー/
■82265 / inTopicNo.3)  Re[1]: ASP MVC IEnumerableメンバーの表示
□投稿者/ WebSurfer (1102回)-(2016/12/26(Mon) 13:06:11)
No82261 (yapii さん) に返信

すみません、訂正します。Body プロパティで取得できるコレクションに BodyModels
が一つ以上存在するとして。

<tr>
<th>@Html.DisplayNameFor(mdl => mdl.Body[0].ID)</th>
<th>@Html.DisplayNameFor(mdl => mdl.Body[0].Name)</th>
</tr>

でどうでしょう?
引用返信 編集キー/
■82266 / inTopicNo.4)  Re[2]: ASP MVC IEnumerableメンバーの表示
□投稿者/ yapii (10回)-(2016/12/26(Mon) 13:14:07)
No82265 (WebSurfer さん) に返信
> ■No82261 (yapii さん) に返信
>
> すみません、訂正します。Body プロパティで取得できるコレクションに BodyModels
> が一つ以上存在するとして。
>
> <tr>
> <th>@Html.DisplayNameFor(mdl => mdl.Body[0].ID)</th>
> <th>@Html.DisplayNameFor(mdl => mdl.Body[0].Name)</th>
> </tr>
>
> でどうでしょう?

データはない可能性ももちろんあります。

通常はどうするのがベターなのでしょうか?
固定出力でしょうか?
モデルのデータの持ち方がおかしいのでしょうか?
引用返信 編集キー/
■82267 / inTopicNo.5)  Re[3]: ASP MVC IEnumerableメンバーの表示
□投稿者/ WebSurfer (1103回)-(2016/12/26(Mon) 13:29:22)
No82266 (yapii さん) に返信

> データはない可能性ももちろんあります。
>
> 通常はどうするのがベターなのでしょうか?
> 固定出力でしょうか?

データがなくても、

vmdl.Body = new List<Models.BodyModels>();

だけしてもらえるのであれば、ヘッダだけは表示されるはずです。

それができない、もしくはヘッダだけ表示されるというのはカッコ悪くて許容できない
ということであれば、View に空か否かを判定するコードを追加して、空の場合は table
を生成するのは止めて「明細データはありません」と言うようなメッセージを表示する
ようにしてはいかがですか。

> モデルのデータの持ち方がおかしいのでしょうか?

自分としてはそこは別におかしいとは思いませんが。
引用返信 編集キー/
■82268 / inTopicNo.6)  Re[4]: ASP MVC IEnumerableメンバーの表示
□投稿者/ yapii (11回)-(2016/12/26(Mon) 13:43:17)
ありがとうございます。

モデルを
public IEnumerable<BodyModels> Body { get; set; }
から
public List<BodyModels> Body { get; set; }
に変更し、以下のようにして表示できました。
<table>
    <tr><th>@Html.DisplayNameFor(mdl => mdl.Body[0].ID)</th><th>@Html.DisplayNameFor(mdl => mdl.Body[0].Name)</th></tr>
    @foreach (var b in Model.Body)
    {
        <tr><td>@Html.DisplayFor(mdl => b.ID)</td><td>@Html.DisplayFor(mdl => b.Name)</td></tr>
    }
</table>

1点教えていただきたいのですが
mdl => mdl.Body[0].IDの[0]はリストデータ1件目ということではないのでしょうか?
どうしてデータが0件のときも、Body[0].IDはエラーにならないのでしょうか!?

引用返信 編集キー/
■82269 / inTopicNo.7)  Re[5]: ASP MVC IEnumerableメンバーの表示
□投稿者/ WebSurfer (1104回)-(2016/12/26(Mon) 13:59:58)
No82268 (yapii さん) に返信

> どうしてデータが0件のときも、Body[0].IDはエラーにならないのでしょうか!?

そこのところは私も分からないです。

@Html.DisplayNameFor では Body[0].ID オブジェクを取得しに行くのではなくて、
BodyModels クラスのパブリックプロパティに付与された Display 属性に設定され
た名前(Display 属性がない場合はプロパティ名)を取得しに行くだけなので、オ
ブジェクトがなくてもエラーにならない・・・のかなぁ、と勝手に想像してますが。

お役に立てずすみません。

引用返信 編集キー/
■82271 / inTopicNo.8)  Re[5]: ASP MVC IEnumerableメンバーの表示
□投稿者/ WebSurfer (1105回)-(2016/12/26(Mon) 15:06:07)
No82268 (yapii さん) に返信

> どうしてデータが0件のときも、Body[0].IDはエラーにならないのでしょうか!?

ちょっと調べてみました。DisplayNameFor はモデルのメタデータ(モデルのデー
タそのものではなくて)を参照して名前を取得しているそうです。

DisplayNameFor metadata でググるといろいろヒットします。例えば下記の記事
の「補足解説: Razor での model, Model, modelItem」のセクションやそこから
参照されている stackoverflow の記事。

http://kazunori-kimura.github.io/how-to-develop-dot-net-apps/asp-102.html

Microsoft の公式文書ではないのが何ですが、信用してよいのでは? 実際にや
ってみた結果もそれを裏付けてますし。
引用返信 編集キー/
■82273 / inTopicNo.9)  Re[6]: ASP MVC IEnumerableメンバーの表示
□投稿者/ yapii (12回)-(2016/12/26(Mon) 21:18:53)
WebSurfer さま

> ちょっと調べてみました。DisplayNameFor はモデルのメタデータ(モデルのデー
> タそのものではなくて)を参照して名前を取得しているそうです。
調べていただいてありがとうございます。
理解できてスッキリしました!


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -