0

私は本当に奇妙な状況に陥っています。私は 1 つのモデルと、このモデルの型で厳密に型指定された 2 つのテンプレートを持っています。テンプレートはネストされています。つまり、最初のテンプレート内の 2 番目のテンプレートで DisplayFor を使用します。最初のテンプレートに関連付けられたモデルを使用すると、2 番目のテンプレートの DisplayFor 呼び出しで、2 番目のテンプレートがレンダリングされません。同じモデル タイプの別のインスタンスを使用すると、すべて正常に動作します。ネストされたテンプレートに関連付けられたモデルには、ある種のサイクル チェックがあるようです。

モデル:

public class MyModel
{
    public string Value { get; set; }
    public MyModel Copy
    {
        get { return (MyModel) this.MemberwiseClone(); }
    }

    public MyModel MySelf
    {
        get { return this; }
    }
}

表示テンプレート 1:

@model TestNestedTemplateSameReference.Models.MyModel

<div>Model1</div>
<div>@Model.Value</div>
<div>@Html.DisplayFor(x=>x, "ModelTemplate2")</div>

表示テンプレート 2:

@model TestNestedTemplateSameReference.Models.MyModel

<div>Model2</div>
<div>@Model.Value</div>

興味深いことに、呼び出す代わりに

@Html.DisplayFor(x=>x, "ModelTemplate2")

Copy プロパティで呼び出します

<div>@Html.DisplayFor(x=>x.Copy, "ModelTemplate2")</div>

MyModel クラスの実際のインスタンスが異なるため、すべて正常に動作します。

なぜこれが行われるのか誰にも分かりません。実行可能な回避策はありますか。これは、スタック オーバーフローや同様の問題を引き起こすべきではない完全に正当な使用法のようです。これを使用して、テンプレート名なしで DisplayFor 呼び出しのサイクルを保護する方法を確認できましたが、テンプレート名を指定すると、正常に機能するように見えます。

同じモデルを複数の EditFor テンプレートにバインドするのは危険なようですが、DisplayFor は安全なようです。

もちろん、ネストレベル用に別のモデルを作成できますが、それは冗長なクラスを作成しています。

どんな助けでも大歓迎です。

4

1 に答える 1

1

あなたがしようとしていたことがうまくいった場合、オブジェクトが Copy メソッドを介して作成された後、オブジェクトとしてスタック オーバーフローが発生します。次に、各オブジェクトはそれ自体の新しいコピーを作成し、すぐにメモリ不足またはスタック不足になります。

デフォルトのテンプレートは、プロパティを表示する前にこのメソッドを実行します

bool ShouldShow(ModelMetadata metadata) {
    return metadata.ShowForEdit
        && metadata.ModelType != typeof(System.Data.EntityState)
        && !metadata.IsComplexType
        && !ViewData.TemplateInfo.Visited(metadata);
}

私の推測では、IsComplexType または TemplateInfo.Visited のいずれかがトリップしていると思われます。

これに関する詳細情報は次のとおりです。

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html

于 2012-05-22T14:37:09.573 に答える