ASP.NET MVCはどのように機能しますViewBag
か?MSDNによると、これは単なるでありObject
、興味深いのはViewBag.Foo
、マジックストリングなどの「マジック」プロパティがViewBag["Hello"]
実際にどのように機能するかです。
また、どのように作成してASP.NET WebFormsアプリで使用できますか?
例をいただければ幸いです。
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";
サンプルの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;
}
}
}
public object ViewBag { get; }
ているのは奇妙ですが、私はそれがであるExpandoObject
というあなたの主張を買っています。私のように、ここでのViewDataとの比較:「だから、基本的に[ViewBag]は...魔法特性を持つ[ViewDataをして]魔法の文字列を置き換えます」。; ^)
public object ViewBag { get; }
MSDN で言う@ruffinは奇妙なことに奇妙ですが、Codeはdynamic ViewBag { get ..
内部的にDynamicViewData
これは動的オブジェクトです。つまり、コントローラでプロパティを追加し、後でビューでそれらを読み取ることができます。これは、基本的に動的型の機能であるオブジェクトを作成するのと同じであるためです。ダイナミクスに関するこの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:これは動的オブジェクトのタイプです。つまり、新しいフィールドをviewbagに動的に追加し、ビューでこれらのフィールドにアクセスできます。新しいフィールドを作成するときに、viewbagのオブジェクトを初期化する必要があります。
例:1. ViewBagの作成:ViewBag.FirstName = "John";
ViewBagのタイプは動的です。もっと、あなたはできませんViewBag["Foo"]
。例外が発生します-'System.Dynamic.DynamicObject'タイプの式に[]を使用したインデックス作成を適用できません。
の内部実装はViewBag
FooをViewData["Foo"]
(ViewDataDictionaryのタイプ)に実際に格納するため、これら2つは交換可能です。ViewData["Foo"]
とViewBag.Foo
。
そしてスコープ。ViewBagとViewDataは、コントローラのアクションとレンダリングするビューの間でデータを受け渡すための機能です。
ViewBagは、動的に値を設定または取得できる動的な型であり、厳密に型指定されたクラスなしで任意の数の追加フィールドを追加できます。これにより、コントローラーからビューにデータを渡すことができます。コントローラで......
public ActionResult Index()
{
ViewBag.victor = "My name is Victor";
return View();
}
ビューで
@foreach(string a in ViewBag.victor)
{
.........
}
私が学んだことは、どちらも動的な名前の保存プロパティ、つまりViewBag.victorを持つ必要があるということです。