24

これは、ヘッダー ( NOT VALUES ) を取得するために機能します。

@model IEnumerable<SomeModel>
...
<th>@Html.DisplayNameFor(m => m.SomeModelProperty)</th>

SomeModelProperty が次の場合:

[Display(Name = "An Excellent Header")]
SomeModelProperty { get; set; }

次に、ヘッダーth要素に「AnExcellentHeader」を表示します。

モデルが m.SomeModelProperty を持たない IEnumerable であるため、これは機能しないと思われるかもしれませんが、HtmlHelper にHtmlHelper<IEnumerable<TModel>>はラムダのパラメーターがTModelではなくであるようなものがあるため、機能しますIEnumerable<TModel>。これはメタデータを使用するだけなので、コレクションからのアイテムは必要ありません。(ただし、インテリセンスはm.あなたに嘘をつき、それがコレクションだと思わせるでしょう)。このクールなオーバーロードがいつ追加されたのかはわかりませんが、Index.cshtml にとって非常に便利で、@Html.DisplayNameFor(m => @Model.FirstOrDefault().SomeModelProperty)私が避けたいファンキーなものを排除します。

http://msdn.microsoft.com/en-us/library/hh833697(v=vs.108).aspx

ただし、モデルが IEnumerable ではなく、次のようにプロパティとして IEnumerable が含まれている場合、これを機能させる方法がわかりません。

public class SomeList
{
   public List<SomeModel> SomeModels { get; set; }
   public int Page { get; set; }
   public DateTime CurrentAsOf { get; set; }
}

ジェネリック型パラメーターを明示することを望んでいましたが、型パラメーターは、ページで作成された HtmlHelper から細流化するエンジンによって指定されていると思います。ページで新しい HtmlHelper を宣言したり、型パラメーターを明示的に指定したりできますか?

インデックス.cshtml:

@model SomeList
//No idea how to do this:
@Html.DisplayNameFor<IEnumerable<SomeModel>>(m => m.SomeModelProperty)
4

2 に答える 2

44

行がない場合でも機能する別の同様の回避策は次のとおりです。

...
@{var dummy = Model.FirstOrDefault(); }
    <tr>
        <th>
            @Html.DisplayNameFor(model => dummy.SomeModelProperty)
        </th>
...
于 2012-12-08T18:10:13.497 に答える
6

ViewModels を使用しているため、まったく同じ問題が発生しているため、実際のオブジェクトの IEnumerable をプロパティとして持つ ViewModel があります。

この投稿に出くわしました。答えを確認すると、この問題http://forums.asp.net/t/1783733.aspxを解決するために、男が独自の HTMLHelper を作成しました。彼のバージョンは次のとおりです。

public static MvcHtmlString DisplayColumnNameFor<TModel, TClass, TProperty>(
    this HtmlHelper<TModel> helper, IEnumerable<TClass> model, 
    Expression<Func<TClass, TProperty>> expression)
{
    var name = ExpressionHelper.GetExpressionText(expression);
    name = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
    var metadata = ModelMetadataProviders.Current.GetMetadataForProperty(
        () => Activator.CreateInstance<TClass>(), typeof(TClass), name);

    return new MvcHtmlString(metadata.DisplayName);
}

通常の式だけではなく、2つの引数の列挙と式を渡す必要があるため、@ franzの回答を好む場合があります。式を適用するビューモデルのどのプロパティを知る必要があるため、2つの引数を渡す必要があることはわかりません。

于 2013-11-18T11:49:05.223 に答える