Как работает ViewBag в ASP.NET MVC
Как работает ASP.NET MVC ViewBag
? MSDN говорит, что это всего лишь Object
, что меня интригует, как на самом деле работают свойства "Magic", такие как ViewBag.Foo
и магические строки ViewBag["Hello"]
?
Также, как я могу создать его и использовать в своем приложении ASP.NET WebForms?
Примеры были бы очень оценены!
Ответы
Ответ 1
ViewBag
имеет тип dynamic
, но внутренне System.Dynamic.ExpandoObject()
Он объявляется следующим образом:
dynamic ViewBag = new System.Dynamic.ExpandoObject();
поэтому вы можете:
ViewBag.Foo = "Bar";
Код объекта Expander Expander:
public class ExpanderObject : DynamicObject, IDynamicMetaObjectProvider
{
public Dictionary<string, object> objectDictionary;
public ExpanderObject()
{
objectDictionary = new Dictionary<string, object>();
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
object val;
if (objectDictionary.TryGetValue(binder.Name, out val))
{
result = val;
return true;
}
result = null;
return false;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
try
{
objectDictionary[binder.Name] = value;
return true;
}
catch (Exception ex)
{
return false;
}
}
}
Ответ 2
Это динамический объект, то есть вы можете добавлять к нему свойства в контроллере и читать их позже в представлении, потому что вы по существу создаете объект, как вы, особенность динамического типа. См. Статью MSDN о динамике. См. в этой статье об использовании в отношении MVC.
Если вы хотите использовать это для веб-форм, добавьте динамическое свойство в класс базовой страницы, например:
public class BasePage : Page
{
public dynamic ViewBagProperty
{
get;
set;
}
}
Устранить все ваши страницы. Вы должны иметь возможность в своей разметке ASP.NET:
<%= ViewBagProperty.X %>
Это должно сработать. Если нет, есть способы обойти это.
Ответ 3
ViewBag
- это System.Dynamic.ExpandoObject
, как было предложено. Свойства в ViewBag
являются по существу KeyValue
парами, где вы получаете доступ к значению с помощью ключа. В этом смысле они эквивалентны:
ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";
Ответ 4
ViewBag используется для передачи данных из действия контроллера для просмотра для передачи передаваемых данных. Теперь вы можете передавать данные, используя действия Controller Action и View, либо с помощью ViewBag, либо ViewData.
ViewBag: тип динамического объекта, что означает, что вы можете добавлять новые поля для динамического просмотра и получать доступ к этим полям в представлении. Вам нужно инициализировать объект viewbag во время создания новых полей.
например:
1. Создание ViewBag:
ViewBag.FirstName = "Джон";
- Доступ к просмотру:
@ViewBag.FirstName.
Ответ 5
ViewBag имеет тип динамический. Более того, вы не можете сделать ViewBag["Foo"]
. Вы получите исключение. Нельзя применять индексирование с [] к выражению типа "System.Dynamic.DynamicObject".
Внутренняя реализация ViewBag
фактически сохраняет Foo в ViewData["Foo"]
(тип ViewDataDictionary), поэтому эти 2 являются взаимозаменяемыми. ViewData["Foo"]
и ViewBag.Foo
.
И область. ViewBag и ViewData предназначены для передачи данных между действиями Controller и View it render.
Ответ 6
public dynamic ViewBag
{
get
{
if (_viewBag == null)
{
_viewBag = new DynamicViewData(() => ViewData);
}
return _viewBag;
}
}