Как моя ViewData может быть нулевой, но расширяется в отладчике?

StackOverflow https://stackoverflow.com/questions/5818331

Вопрос

Только что наткнулся на интересный эффект, отладки взглядом. Сценарий легко воспроизвести - у меня есть точка останова в View, в окне часов я добавляю ViewBag.ViewData и значение null. Анкет Однако, если я просто добавлю ViewBag и расширить объект, я вижу ViewData и это не null. Анкет Я также могу успешно расширить его и увидеть его свойства.

Может ли кто -нибудь объяснить, является ли это ошибкой или что вызывает такое поведение?

ViewBag.ViewData in Watch window

РЕДАКТИРОВАТЬ

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.ViewData По мнению (линия с if (ViewBag.ViewData == null))?

Это было полезно?

Решение

То, что вы видите в окне отладчика/наблюдения, - это частный ViewData собственность ViewBag. Анкет Когда вы выполняете тест в представлении, вы, очевидно, не имеете доступа к этому личному полю, и вы получаете NULL, потому что нет соответствующей общественной собственности.

Теперь сделайте следующий тест в представлении:

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

И вы не увидите промежуток.

Конечно, все это очень забавно, но когда дело доходит до написания реального мира и правильно зачислительно приложения ASP.NET MVC Оба ViewData а также ViewBag нет места. Эти двое - мои худшие враги в разработке приложений ASP.NET MVC.

Заключение: всегда используйте модели просмотра и крепко напечатанные представления и получайте удовольствие.

Другие советы

У меня нет технического объяснения, но я считаю, что это потому, что Viewbag динамичен. Это все равно, что делать часы на выражение, вы не видите содержимое результатов, не выполняя выражение.

Я полагаю, что Viewbag ведет себя так же, потому что вы идете непосредственно к свойству, которое не было загружено, и вы делаете это с помощью отладчика, он просто решает не загружать это свойство.

Я мог бы ошибаться, конечно: D

Просто ради аргументов, делает ли это то же самое в быстром наблюдении или в непосредственном окне?

В то время как ваш код всегда работает в пределах определенной области (класс, метод, частный и т. Д.), У отладчика нет таких ограничений

Почему вы ссылаетесь на viewbag.viewdata? Просто ссылка на просмотр напрямую. Это может работать, потому что за кулисами Viewbag использует ViewData, вы можете рассматривать внутреннее представление ViewData, отдельно, чем ваше свойство Dynamimc "ViewData"

После тестирования этого Viewbag появляется как непубличный участник ... это то, что я ожидаю. System.web.mvc.dynamicViewDataDictionary имеет не публичный член viewData

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top