Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Dúvida no Exercício que exibe mensagem

Não estou sabendo exibir a mensagem "Produto cadstrado com sucesso."

Na controller:

[HttpPost]
        public ActionResult Adiciona(Produto produto)
        {
            // implementação da action
            ProdutosDAO dao = new ProdutosDAO();
            dao.Adiciona(produto);
            ViewBag.Mensagem = "Produto adicionado com sucesso";
            return RedirectToAction("Index");
        }

Na View

<div> {{ViewBag.Mensagem}}</div>

Mas não funcionou como eu esperava.

5 respostas

Olá, Vanessa!

Experimente o seguinte código:

<div>@ViewBag.Mensagem</div>

Funciona. E quando eu uso {{ variavel ou ViewBag.Mensagem }} entre chavez ??

Vanessa, acho que você se referindo à sintaxe de chaves duplas do AngularJS, por exemplo:

<button ng-click="changeFoo()">{{buttonText}}</button>

https://docs.angularjs.org/guide/templates

Embora seja perfeitamente possível ter essas chaves duplas em projetos ASP.NET MVC, essa sintaxe roda no cliente e não no servidor. Ou seja, o AngularJS é quem vai fazer o binding e substituir a expressão entre chaves duplas via JavaScript no client (no navegador).

Agora, sempre que você usa ViewBag numa view, você está acessando um código C# dentro de uma view Razor. Por isso mesmo, coloquei um arroba @ no início de @ViewBag, para sinalizar que isso é uma expressão C# que deve ser avaliada no servidor. Sem o @, a expressão não é avaliada nem substituída, e o texto que você vê na página no navegador fica exatamente com a expressão que estava na view.

Entendi. Sim, é código de AngularJS. Como eu trabalhava num lugar que tinha as duas tecnologias, achei que fosse tudo do Razor e não entendia porque hora usava um e outra hora usava outro. Valeu.

Só acrescentando na pergunta anterior paa confirmar o meu entendimento: O @ No curso de MVC do Alura, hora tem @ViewBag e hora tem ViewBag, sem @. Veja o exemplo:


<form action="/Produto/Adiciona" method="post">
    @Html.ValidationMessage("produto.InformaticaComPrecoInvalido")

    <label for="nome">Nome:</label>
    <input id="nome" name="produto.Nome" value="@ViewBag.Produto.Nome" class="form-control"/><!--aqui tem o @-->
    @Html.ValidationMessage("produto.Nome")

    <label for="preco">Preço:</label>
    <input id="preco" name="produto.Preco" value="@ViewBag.Produto.Preco" class="form-control"/>
    @Html.ValidationMessage("produto.Preco")

    <label for="quantidade">Quantidade:</label>
    <input id="quantidade" name="produto.Quantidade" value="@ViewBag.Produto.Quantidade" class="form-control"/>

    <label for="descricao">Descrição:</label>
    <input id="descricao" name="produto.Descricao" value="@ViewBag.Produto.Descricao" class="form-control"/>

    <label for="categoria">Categoria:</label>
    <select id="categoria" name="produto.CategoriaId" class="form-control" >
        @foreach (var categoria in ViewBag.Categorias) <!--Aqui não tem o @-->
        {
            <option value="@categoria.Id" selected="@categoria.Id.Equals(ViewBag.Produto.CategoriaId)"> <!--Aqui não tem o @ na ViewBag-->
                @categoria.Nome
            </option>
        }
    </select>

    <input type="submit" />

    <p>@Html.ActionLink("Voltar para Produto", "Index", "Produto")</p>
</form>

No dia a dia eu me enrolo na decisão de quando colocar o @. Tem alguma dica? Obrigada.

solução!

Ah sim!

É simples: o arroba serve para marcar o início de um bloco de código C# do Razor:

@foreach (var categoria in ViewBag.Categorias)

Então por que o ViewBag não começa com arroba neste caso? Porque ele já faz parte de um bloco C#, que começa com @foreach. Então o @ no ViewBag só deve ser usado quando o código imediatamente anterior a ele for HTML, e não C#.