6

DataAnnotations を使用して MVC2 アプリを作成しています。私は次のモデルを持っています:

public class FooModel 
{
    [ScaffoldColumn("false")]
    public long FooId { get; set; }

    [UIHint("BarTemplate")]
    public DateTime? Bar { get; set;}
}

Bar のカスタム表示テンプレートを作成したいと考えています。次のテンプレートを作成しました。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DateTime?>" %>

<div class="display-label">
    <span><%: Html.LabelForModel() %></span>
</div>
<div class="display-field">
    <span><%: Html.DisplayForModel()%></span>
    <%: Html.ActionLink("Some link", "Action", new { id = ??FooId?? }) %>
</div>

さて、私の問題は、Bar のテンプレート内で、モデルから別のプロパティにアクセスしたいということです。他のすべての FooModel プロパティをハードコードする必要があるため、FooModel 用に個別のテンプレートを作成したくありません。

デバッガーで簡単に調査した後、次のことがわかります。

  1. this.ViewData.ModelMetadata.ContainerType ですFooModel(予想通り)
  2. this.ViewData.TemplateInfoには、 と の2 つの要素を含む VisitedObjects (タイプ の )非パブリック プロパティがあります。System.Collections.Generic.HashSet<object>FooModelDateTime?

FooModel にアクセスするにはどうすればよいですか? Reflection を使って自分のやり方をハックしたくありません。

アップデート:

タイプセーフを可能にする最良の解決策として私には見えるので、ムーティネーターの答えを受け入れました。Mootinatorの回答がそれに基づいているため、Tx3の回答にも賛成しました。それにもかかわらず、この種のシナリオでは、MVC からのより良いサポートが必要だと思います。これは、現実の世界では非常に一般的ですが、サンプル アプリには欠けていると思います。

4

5 に答える 5

3

たとえば、UserDateTimeなどの新しいクラスを作成すると、null許容のDateTimeと必要な残りの情報が含まれる可能性があります。次に、UserDateTimeのカスタム表示テンプレートを使用して、必要な情報にアクセスします。

私はあなたが他の種類の解決策を探しているかもしれないことを理解しています。

于 2011-02-15T13:16:51.473 に答える
2

この機能を親ビューからの HtmlHelper 呼び出しに抽出した方がよいと思います。

RenderSpecialDateTime<TModel>(this HtmlHelper html, Expression<Func<TModel,DateTime?>> getPropertyExpression)おそらく仕事をするような何か。

それ以外の場合は、Tx3 が提案したようなことを行う必要があります。私は彼の答えに賛成しましたが、代わりにこれを投稿しました。

于 2011-02-18T02:24:44.440 に答える
1

コントローラーで ViewData ディクショナリ オブジェクトを使用して、それを ViewUserControl で取得できませんでしたか? 厳密に型指定されるわけではありませんが...空の場合は何もしないヘルパーを作成し、値がある場合はログイン履歴ページの例を示すリンクを作成できます。

于 2011-02-15T22:26:11.913 に答える
0

この提案がばかげているように思われる場合は申し訳ありませんが、試したことはありませんが、必要なタイプの親を参照するジェネリック クラスを定義することで、新しいクラスを多数作成することなく、Tx3 が提案したことを実行できませんでしたか?

    public class FooModel 
    {
        [ScaffoldColumn("false")]
        public long FooId { get; set; }

        [UIHint("BarTemplate")]
        public ParentedDateTime<FooModel> Bar { get; set;}

        public FooModel()
        {
            Bar = new ParentedDateTime<FooModel>(this);
        }
    }


    public class ParentedDateTime<T>
    {
        public T Parent {get; set;}
        public DateTime? Babar {get; set; }

        public ParentedDateTime(T parent)
        {
            Parent = parent;
        }

}

<Parent, Child>それを拡張して、古い型を型付きジェネリックでカプセル化することもできます。

これにより、強く型付けされたテンプレートのメリットも得られます

Inherits="System.Web.Mvc.ViewUserControl<ParentedDateTime<FooType>>したがって、どこでも使用するテンプレートを明示的に指定する必要はありません。これは、物事がどのように機能することを意図しているかです。

于 2011-02-21T18:46:01.837 に答える