ASP.NET MVCのViewBag
はどのように機能しますか? MSDNは、それがObject
だけであると言います。これは、ViewBag.Foo
やマジックストリングViewBag["Hello"]
などの「マジック」プロパティが実際にどのように機能するのですか?
また、ASP.NET WebFormsアプリで作成して使用するにはどうすればよいですか?
例は本当にありがたいです!
ViewBag
はdynamic
型ですが、内部的にはSystem.Dynamic.ExpandoObject()
です
次のように宣言されます。
dynamic ViewBag = new System.Dynamic.ExpandoObject();
それがあなたができる理由です:
ViewBag.Foo = "Bar";
サンプルエキスパンダーオブジェクトコード:
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;
}
}
}
これは動的オブジェクトです。つまり、本質的に動的タイプの機能であるオブジェクトを作成しているため、コントローラーでプロパティを追加し、後でビューで読み取ることができます。これを参照してください MSDN記事 ダイナミクス。 MVCに関連した使用方法については、 この記事 を参照してください。
これをWebフォームに使用する場合は、次のように動的プロパティをベースページクラスに追加します。
public class BasePage : Page
{
public dynamic ViewBagProperty
{
get;
set;
}
}
すべてのページにこれを継承させます。 ASP.NETマークアップでできることは次のとおりです。
<%= ViewBagProperty.X %>
うまくいくはずです。そうでない場合は、回避する方法があります。
ViewBag
は、提案されているSystem.Dynamic.ExpandoObject
です。 ViewBag
のプロパティは基本的にKeyValue
のペアであり、キーによって値にアクセスします。この意味では、これらは同等です。
ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";
ViewBagを使用して、コントローラーアクションからビューにデータを渡し、渡されたデータをレンダリングします。これで、ViewBagまたはViewDataを使用して、コントローラーアクションとビューの間でデータを渡すことができます。 ViewBag:これは動的オブジェクトの一種です。つまり、新しいフィールドをビューバッグに動的に追加して、ビューのこれらのフィールドにアクセスできます。新しいフィールドを作成するときに、ビューバッグのオブジェクトを初期化する必要があります。
例:1. ViewBagの作成:ViewBag.FirstName = "John";
ViewBagは動的タイプです。さらに、ViewBag["Foo"]
はできません。例外が発生します-タイプ[System.Dynamic.DynamicObject 'の式に[]のインデックスを適用できません。
ViewBag
の内部実装は、実際にFooをViewData["Foo"]
(ViewDataDictionaryのタイプ)に格納するため、これら2つは交換可能です。 ViewData["Foo"]
およびViewBag.Foo
。
そしてスコープ。 ViewBagとViewDataは、コントローラーのアクションとそれがレンダリングするビューの間でデータを受け渡すためのmentです。
ViewBagは、動的に値を設定または取得できる動的タイプであり、厳密に型指定されたクラスなしで任意の数の追加フィールドを追加できるようにします。コントローラーで......
public ActionResult Index()
{
ViewBag.victor = "My name is Victor";
return View();
}
ビューで
@foreach(string a in ViewBag.victor)
{
.........
}
私が学んだことは、両方が動的な名前の保存プロパティ、つまりViewBag.victorを持っている必要があるということです