web-dev-qa-db-ja.com

ASP.NET MVCのViewBagの仕組み

ASP.NET MVCのViewBagはどのように機能しますか? MSDNは、それがObjectだけであると言います。これは、ViewBag.FooやマジックストリングViewBag["Hello"]などの「マジック」プロパティが実際にどのように機能するのですか?

また、ASP.NET WebFormsアプリで作成して使用するにはどうすればよいですか?

例は本当にありがたいです!

93
Aniket Inge

ViewBagdynamic型ですが、内部的には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;
        }
    }
}
87
Aniket Inge

これは動的オブジェクトです。つまり、本質的に動的タイプの機能であるオブジェクトを作成しているため、コントローラーでプロパティを追加し、後でビューで読み取ることができます。これを参照してください MSDN記事 ダイナミクス。 MVCに関連した使用方法については、 この記事 を参照してください。

これをWebフォームに使用する場合は、次のように動的プロパティをベースページクラスに追加します。

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

すべてのページにこれを継承させます。 ASP.NETマークアップでできることは次のとおりです。

<%= ViewBagProperty.X %>

うまくいくはずです。そうでない場合は、回避する方法があります。

32
Brian Mains

ViewBagは、提案されているSystem.Dynamic.ExpandoObjectです。 ViewBagのプロパティは基本的にKeyValueのペアであり、キーによって値にアクセスします。この意味では、これらは同等です。

ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";
7

ViewBagを使用して、コントローラーアクションからビューにデータを渡し、渡されたデータをレンダリングします。これで、ViewBagまたはViewDataを使用して、コントローラーアクションとビューの間でデータを渡すことができます。 ViewBag:これは動的オブジェクトの一種です。つまり、新しいフィールドをビューバッグに動的に追加して、ビューのこれらのフィールドにアクセスできます。新しいフィールドを作成するときに、ビューバッグのオブジェクトを初期化する必要があります。

例:1. ViewBagの作成:ViewBag.FirstName = "John";

  1. ビューへのアクセス:@ ViewBag.FirstName。
5
Sachin Gaikwad

ViewBagは動的タイプです。さらに、ViewBag["Foo"]はできません。例外が発生します-タイプ[System.Dynamic.DynamicObject 'の式に[]のインデックスを適用できません

ViewBagの内部実装は、実際にFooをViewData["Foo"](ViewDataDictionaryのタイプ)に格納するため、これら2つは交換可能です。 ViewData["Foo"]およびViewBag.Foo

そしてスコープ。 ViewBagとViewDataは、コントローラーのアクションとそれがレンダリングするビューの間でデータを受け渡すためのmentです。

3
Nenad

ViewBagは、動的に値を設定または取得できる動的タイプであり、厳密に型指定されたクラスなしで任意の数の追加フィールドを追加できるようにします。コントローラーで......

public ActionResult Index()
{
    ViewBag.victor = "My name is Victor";
    return View();
}

ビューで

@foreach(string a in ViewBag.victor)
{
     .........
}

私が学んだことは、両方が動的な名前の保存プロパティ、つまりViewBag.victorを持っている必要があるということです

0
Dexter