7

ビューのデバッグ中に興味深い効果に遭遇しました。シナリオは簡単に再現できます。View追加したウォッチ ウィンドウにブレークポイントがViewBag.ViewDataあり、値はnullです。ViewBagただし、オブジェクトを追加して展開するだけで、 が表示され、ViewDataではありませんnull。また、正常に展開してそのプロパティを確認することもできます。

それがバグなのか、それともこの動作の原因なのか、誰か説明できますか?

ウォッチ ウィンドウの ViewBag.ViewData

編集

ViewBag.ViewDataは実際にnull。たとえば、ビューにこのコードがある場合:

if (ViewBag.ViewData == null)
{
    <span>ViewBag.ViewData is null</span>
}

スパンを表示します。奇妙な点は、ウォッチ ウィンドウで展開してプロパティを表示できることです。

EDIT2

@Darin Dimitrov の回答に応えて - カスタム テスト クラスでこの動作を再現しよRuntimeBinderExceptionうとしましたが、プライベート プロパティにアクセスしようとすると、次のようになり'SomeClass.SomeProperty' is inaccessible due to its protection levelます。

public class SomeClass
{
    private string SomeProperty;
}

dynamic dynamicObject = new SomeClass();
if (dynamicObject.SomeProperty == null)
{
    Console.WriteLine("dynamicObject.SomeProperty is null");
}

この場合、ViewBag.ViewDataView でアクセスしたときに同じ例外が発生するのではないif (ViewBag.ViewData == null)でしょうか ( の行)。

4

4 に答える 4

6

デバッガー/ウォッチ ウィンドウに表示されるの ViewDataViewBag. ビューでテストを実行すると、明らかにこのプライベート フィールドにアクセスできず、対応するパブリック プロパティがないため null になります。

ビューで次のテストを実行します。

@if (null == ViewBag
         .GetType()
         .GetProperty("ViewData", BindingFlags.Instance | BindingFlags.NonPublic)
         .GetValue(ViewBag, null)
)
{
    <span>ViewBag.ViewData is null</span>
}

スパンは表示されません。

もちろん、これはすべて非常に面白いことですが、現実の世界と適切に設計された ASP.NET MVC アプリケーションの両方を作成することになるとViewDataViewBag場所がありません。この 2 つは、ASP.NET MVC アプリケーション開発における私の最大の敵です。

結論: 常にビュー モデルと厳密に型指定されたビューを使用し、楽しんでください。

于 2011-04-28T18:49:44.677 に答える
0

技術的な説明はありませんが、ViewBagが動的であるためだと思います。式を監視するようなもので、式を実行しないと結果セットの内容が表示されません。

ViewBagも同じように動作していると思います。ロードされていないプロパティに直接移動し、デバッガーを介して実行しているため、そのプロパティをロードしないことを決定するだけです。

もちろん私は完全に間違っている可能性があります:D

議論のために、クイックウォッチでもイミディエイトウィンドウでも同じことをしますか?

于 2011-04-28T12:32:05.573 に答える
0

コードは常に特定のスコープ (クラス、メソッド、プライベートなど) の制限内で実行されますが、デバッガーにはそのような制限はありません。

于 2011-04-28T14:48:23.290 に答える
0

なぜ ViewBag.ViewData を参照しているのですか? ViewData を直接参照するだけです。これは、バックグラウンドでビューバッグがビューデータを使用するため、「ViewData」の動的プロパティとは別に、ViewData の内部表現を見ている可能性があるため、機能する可能性があります。

これをテストした後、ViewBag は非公開メンバーとして表示されます...これは私が期待することです。System.Web.Mvc.DynamicViewDataDictionary には非パブリック メンバー ViewData があります

于 2011-04-28T14:51:53.793 に答える