Definir Viewbag antes do redirecionamento

122

É possível definir o ViewBagantes de chamar um redirecionamento?

Eu quero algo como:

@ViewBag.Message="MyMessage";
RedirectToAction("MyAction");
daniel
fonte

Respostas:

242

Quando você usa o redirecionamento, não deve usar ViewBag, masTempData

public ActionResult Action1 () {
 TempData["shortMessage"] = "MyMessage";
 return RedirectToAction("Action2");
}

public ActionResult Action2 () {
 //now I can populate my ViewBag (if I want to) with the TempData["shortMessage"] content
  ViewBag.Message = TempData["shortMessage"].ToString();
  return View();
}
Raphaël Althaus
fonte
1
Por que você tem o @ViewBag se não está na exibição?
apkisbossin
6
Gostaria de completar a resposta porque a estou usando e enfrentei um pequeno problema que é quando o TempData está vazio por algum motivo (no meu caso, só tenho uma mensagem quando é feita uma conversão). Então eu tive que fazer o teste if (TempData ["Message"]! = Null) para evitar um erro.
Patrick
1
E se o redirecionamento for para outro controlador? Na ação do outro controlador, ViewBag, TempData e Session estão todos vazios!
Andrew
1
@ Andrew, bem, TempData não está relacionado a um controlador específico. Talvez você faça mais de um redirecionamento e perca TempData? Você pode conectar-se a uma nova pergunta com algum código ...
Raphaël Althaus
Eu estava tentando definir aqueles no metodo OnAuthorize de um atributo de filtro, mas nenhum funcionou, então acabei usando a string de consulta para passar os dados. Por outro lado, definir TempData no controlador funcionou quando mais tarde precisei ler isso no atributo filter. Obrigado!
Andrew
13

Você pode usar o TempData nessa situação. Aqui está uma explicação para o ViewBag, ViewData e TempData.

laszlokiss88
fonte
8

Eu fiz assim ... e está funcionando para mim ... aqui estou alterando a senha e, com sucesso, quero definir a mensagem de sucesso como viewbag para exibir em exibição ..

    public ActionResult ChangePass()
    {
        ChangePassword CP = new ChangePassword();
        if (TempData["status"] != null)
        {
            ViewBag.Status = "Success";
            TempData.Remove("status");
        }
        return View(CP);
    }

    [HttpPost]
    public ActionResult ChangePass(ChangePassword obj)
    {
        if (ModelState.IsValid)
        {
            int pid = Session.GetDataFromSession<int>("ssnPersonnelID");
            PersonnelMaster PM = db.PersonnelMasters.SingleOrDefault(x => x.PersonnelID == pid);

            PM.Password = obj.NewPassword;
            PM.Mdate = DateTime.Now;
            db.SaveChanges();

            TempData["status"] = "Success";
            return RedirectToAction("ChangePass");
        }

        return View(obj);
    }
RAVI VAGHELA
fonte
3

Retirado daqui

Resumo

Os objetos ViewData e ViewBag oferecem maneiras de acessar esses dados extras que acompanham seu modelo; no entanto, para dados mais complexos, você pode passar para o ViewModel. O TempData, por outro lado, é voltado especificamente para trabalhar com dados em redirecionamentos HTTP, portanto, tenha cuidado ao usar o TempData.

Paul Zahra
fonte
-2

Ou você pode usar a Sessão como alternativa:

Session["message"] = "MyMessage";
RedirectToAction("MyAction");

e depois ligue sempre que precisar.

ATUALIZAR

Além disso, como o @James disse em seu comentário, seria seguro anular ou limpar o valor dessa sessão específica depois de usá-la para evitar dados indesejados indesejados ou valor desatualizado.

Jon P
fonte
4
Eu não concordo com isso. não use sessão para isso.
precisa saber é o seguinte
2
É uma alternativa. É preferível em determinadas situações.
precisa saber é o seguinte
As variáveis ​​de sessão são úteis para itens que você precisa acompanhar entre várias postagens / obtenções. Para um uso único como esse, você deve se lembrar de limpá-lo, ou mais tarde haverá dados indesejados, parecendo indesejados em alguma tela ou até acionando a lógica fora do contexto.
James
@ James Exatamente, é isso que faço em alguns casos, preciso usar essa abordagem. Anular ou limpar seu valor após o uso é uma obrigação para casos como estes.
Jon P