27711

[code]

    View.csthml
    <table>
      <tr>
        <th>@Html.DisplayNameFor(model => model.FirstName)</th>
        <td>@Html.DisplayFor(model => model.FirstName)</td>
      </tr>
      <tr>
        <th>@Html.DisplayNameFor(model => model.LastName)</th>
        <td>@Html.DisplayFor(model => model.LastName)</td>
      </tr>
      ・・・
    
    </table>
    
[/code]

上記のように、モデルの各プロパティの表示名とデータ値を table に表示するページがあります。

[code]

    <tr>
      <th>@Html.DisplayNameFor(プロパティ)</th>
      <td>@Html.DisplayFor(プロパティ)</td>
    </tr>
    
[/code]

の部分は定型なので、部分ビューにして、

[code]

    _Partial.csthml
    @model object
    <tr>
      <th>@Html.DisplayNameFor(model => model)</th>
      <td>@Html.DisplayFor(model => model)</td>
    </tr>
    
[/code]

本体のページを

[code]

    View.csthml
    <table>
      @Html.Partial("_Partial", Model.FirstName)
      @Html.Partial("_Partial", Model.LastName)
      ・・・
    
    </table>
    
[/code]

に変更してみたのですが

・表示名が表示されない  
・データ値は表示されるが、モデルのプロパティに指定した DisplayFormat が効いていない

という状態です。

DisplayNameFor、DisplayForを毎回記述せずに１行にまとめられれば、どのような方法でも良いのですが、どのような解決策があるでしょうか？


CC BY-SA 3.0
2016-07-18T12:14:09.640
27707
2016-07-18T13:48:29.817
3925
question
asp.net razor
DisplayNameFor と DisplayFor を1行にまとめたい


`HtmlHelper`の`***For`という`Expression`を取る拡張メソッドはラムダ式によって得られる式木を解釈し、プロパティのカスタム属性を読み込んでいます。なので`object`型を使用すると結果が変わって今います。

これに対処するためには独自のジェネリック拡張メソッドを作成するしかないと思います。

[code]

    public static class Helper
    {
        public static MvcHtmlString TableRowFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
        {
            return new MvcHtmlString("<tr><th>"
                + helper.DisplayNameFor(expression)
                + "</th><td>"
                + helper.DisplayFor(expression)
                + "</td></tr>");
        } 
    }
    
[/code]

なお拡張メソッドを有効にするには`Views/Web.config`か各`cshtml`に該当クラスの名前空間を追加する必要があります。


CC BY-SA 3.0
2016-07-18T13:48:29.817
27711
2016-07-18T13:48:29.817
5750
27707
answer