Como funciona o ViewBag na ASP.NET MVC


102

Como funciona o ASP.NET MVC ViewBag? MSDN diz que é apenas um Object, o que me intriga, como as propriedades "Magic", como ViewBag.Fooe strings mágicas ViewBag["Hello"]realmente funcionam?

Além disso, como posso fazer um e usá-lo em meu aplicativo ASP.NET WebForms?

Os exemplos seriam muito apreciados!


O conceito não parece ser necessário em WebForms porque a página já tem acesso direto às variáveis ​​em seu arquivo code-behind. Já no MVC, a visão não tem acesso a nada no controlador além dos dados que são passados ​​na visão ViewBag ou Modelo.
Richard Dalton

Respostas:


91

ViewBagé do tipo dynamic, mas internamente é umSystem.Dynamic.ExpandoObject()

É declarado assim:

dynamic ViewBag = new System.Dynamic.ExpandoObject();

é por isso que você pode fazer:

ViewBag.Foo = "Bar";

Um exemplo de código de objeto expansor:

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;
        }
    }
}

1
Estranho que apenas diga public object ViewBag { get; }na página do MSDN para ViewBag , mas estou acreditando que é umExpandoObject . Eu gosto da comparação com ViewData aqui : " Então, basicamente [ViewBag] substitui strings mágicas [em ViewData] ... por propriedades mágicas ". ; ^)
ruffin

@ruffin estranhamente estranho que diz public object ViewBag { get; }no MSDN, Code diz dynamic ViewBag { get .. que internamente é do tipo DynamicViewData
Aniket Inge

Muito bom . Obrigado por desenterrar isso. E eu marquei com +1 e disse que acreditava em você! ; ^)
ruffin

2
@ruffin outro caso em que a documentação mente e o código nunca mente
Aniket Inge

Às vezes fico impressionado ao encontrar as respostas certas para questões não tão claras / confusas. Obrigado!
Oscar Ortiz

33

É um objeto dinâmico, o que significa que você pode adicionar propriedades a ele no controlador e lê-las posteriormente na visualização, porque você está essencialmente criando o objeto enquanto o faz, um recurso do tipo dinâmico. Consulte este artigo do MSDN sobre dinâmica. Veja este artigo sobre seu uso em relação ao MVC.

Se você quiser usar isso para formulários da web, adicione uma propriedade dinâmica a uma classe de página base como:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

Faça com que todas as suas páginas sejam herdadas disso. Você deve ser capaz de, em sua marcação ASP.NET, fazer:

<%= ViewBagProperty.X %>

Isso deve funcionar. Se não, existem maneiras de contornar isso.


Eu sei o que é ViewBag, quero saber como fazer um objeto como esse em WebForms, o que significa que quero codificá-lo manualmente.
Aniket Inge de

Atualizado acima com uma implementação.
Brian Mains de

8

O ViewBagé um System.Dynamic.ExpandoObjectconforme sugerido. As propriedades no ViewBagsão essencialmente KeyValuepares, onde você acessa o valor pela chave. Nesse sentido, são equivalentes:

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

Eu sei o que é ViewBag, quero saber como fazer um objeto como esse em WebForms, o que significa que quero codificá-lo manualmente.
Aniket Inge de

@Aniket Você tem um ViewState em formulários da web.
Konstantin Dinev

5

ViewBag é usado para passar dados da Ação do Controlador para visualizar e renderizar os dados que estão sendo passados. Agora você pode passar dados usando entre Controller Action e View usando ViewBag ou ViewData. ViewBag: É um tipo de objeto Dinâmico, ou seja, você pode adicionar novos campos ao viewbag de forma dinâmica e acessar esses campos na Visualização. Você precisa inicializar o objeto de viewbag no momento de criar novos campos.

Ex: 1. Criando ViewBag: ViewBag.FirstName = "John";

  1. Acessando a visualização: @ ViewBag.FirstName.

3

ViewBag é do tipo dinâmico. Mais, você não pode fazer ViewBag["Foo"]. Você obterá uma exceção - não é possível aplicar indexação com [] a uma expressão do tipo 'System.Dynamic.DynamicObject' .

A implementação interna de ViewBagrealmente armazena Foo em ViewData["Foo"](tipo de ViewDataDictionary), então esses 2 são intercambiáveis. ViewData["Foo"]e ViewBag.Foo.

E escopo. ViewBag e ViewData são para passar dados entre as Ações do Controlador e a Visualização que ele renderiza.


0

ViewBag é um tipo dinâmico que permite definir ou obter valores dinamicamente e adicionar qualquer número de campos adicionais sem uma classe fortemente tipada. Eles permitem que você passe dados do controlador para a visualização. No controlador ......

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

Em vista

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

O que aprendi é que ambos devem ter a propriedade salvar nome dinâmico, ou seja, ViewBag.victor


-1
public dynamic ViewBag
{
    get
    {
        if (_viewBag == null)
        {
            _viewBag = new DynamicViewData(() => ViewData);
        }

        return _viewBag;
    }
}

3
Solicito que você adicione algum contexto / comentário em torno do código que você compartilhou. Isso ajudará o autor da pergunta e outros leitores futuros a entender melhor sua postagem.
RBT
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.