Как моя ViewData может быть нулевой, но расширяется в отладчике?
-
26-10-2019 - |
Вопрос
Только что наткнулся на интересный эффект, отладки взглядом. Сценарий легко воспроизвести - у меня есть точка останова в View
, в окне часов я добавляю ViewBag.ViewData
и значение null
. Анкет Однако, если я просто добавлю ViewBag
и расширить объект, я вижу ViewData
и это не null
. Анкет Я также могу успешно расширить его и увидеть его свойства.
Может ли кто -нибудь объяснить, является ли это ошибкой или что вызывает такое поведение?
РЕДАКТИРОВАТЬ
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