2013-10-10 13 views
6

domanda diretta, non sembra che il mio valore viewBag venga visualizzato in una vista a cui l'utente viene indirizzato dopo aver completato un modulo.Perché il valore del viewbag non torna alla visualizzazione?

prega advise..thanks

mio indice ActionResult semplici dati resi modello ..

public ActionResult Index() 
{ 
    var source = _repository.GetByUserID(_applicationUser.ID); 
    var model = new RefModel 
    { 
     test1 = source.test1, 
    }; 
    return View(model); 
} 

mio Get Modifica" ActionResult, semplicemente utilizza gli stessi dati del modello come indice.

My Post "Modifica" ActionResult, assegna i nuovi valori eventuali al modello e reindirizza alla pagina di indice, ma la pagina indice non viene visualizzato il valore ViewBag ??

[HttpPost] 
public ActionResult Edit(RefModell model) 
{ 
    if (ModelState.IsValid) 
    { 
     var source = _repository.GetByUserID(_applicationUser.ID); 
     if (source == null) return View(model); 

     source.test1 = model.test1; 
     _uow.SaveChanges(); 

     @ViewBag.Message = "Profile Updated Successfully"; 
     return RedirectToAction("Index");  
    } 
    return View(model); 
} 

E a mio avviso Indice ...

@if(@ViewBag.Message != null) 
{ 
    <div> 
     <button type="button">@ViewBag.Message</button> 
    </div> 
} 

risposta

23

ViewBag vive solo per la richiesta corrente. Nel tuo caso stai reindirizzando, quindi tutto ciò che potresti aver memorizzato nel ViewBag morirà insieme alla richiesta corrente. Utilizzare ViewBag, solo se si esegue il rendering di una vista, non se si intende reindirizzare.

Uso TempData invece:

TempData["Message"] = "Profile Updated Successfully"; 
return RedirectToAction("Index"); 

e quindi a suo avviso:

@if (TempData["Message"] != null) 
{ 
    <div> 
     <button type="button">@TempData["Message"]</button> 
    </div> 
} 

Dietro le quinte, TempData userà sessione ma sarà sfrattare automaticamente il record una volta letto da esso. Quindi è fondamentalmente utilizzato per di breve durata, di archiviazione di persistenza a un reindirizzamento.

In alternativa si potrebbe passare come parametro di stringa di query, se non si vuole fare affidamento su sessioni (che probabilmente è quello che vorrei fare).

2

RedirectToAction provoca una risposta HTTP 302, che consente al client di effettuare un'altra chiamata al server e richiedere una nuova pagina.

Si dovrebbe restituire una vista anziché il reindirizzamento.

+0

Bene, in realtà, è consigliabile reindirizzare dopo un modello POST - redirect-after-post. Restituisci la visualizzazione solo se ci sono alcuni errori che l'utente deve correggere e reinviare. –

+0

L'utente ha chiesto come domanda diretta, ho dato una risposta diretta sul motivo per cui il valore non veniva visualizzato. – Natan

+0

Non so, il rovescio della medaglia di archiviarlo nella sessione è che dà problemi se si vuole scalare. Sarei favorevole a restituire direttamente una vista piuttosto che a memorizzarla nelle sessioni (di cui dovresti sempre essere cauto) – Kristof

2

Il RedirectToAction (msdn) istruisce il browser per fare una nuova richiesta.
Quindi il tuo server verrà chiamato di nuovo ma sarà una nuova richiesta con un viewbag vuoto e tutto
Si potrebbe eseguire una sorta di reindirizzamento interno semplicemente chiamando il metodo index, in questo modo il viewbag avrà ancora i suoi dati.

Modifica: dovrai anche modificare il metodo dell'indice oppure la linea View (modello) proverà a eseguire il rendering.
completa codice qui sotto

public ActionResult Index() 
{ 
    var source = _repository.GetByUserID(_applicationUser.ID); 
    var model = new RefModel 
    { 
     test1 = source.test1, 
    }; 
    return View("Index",model); 
} 


[HttpPost] 
public ActionResult Edit(RefModell model) 
{ 
    if (ModelState.IsValid) 
    { 
     var source = _repository.GetByUserID(_applicationUser.ID); 
     if (source == null) return View(model); 

     source.test1 = model.test1; 
     _uow.SaveChanges(); 

     @ViewBag.Message = "Profile Updated Successfully"; 
     return Index();  
    } 
    return View(model); 
} 
+0

Leggenda, che ha funzionato perfettamente, grazie – mkell

+0

Solo per aggiungere un'ulteriore svolta a questa domanda ... cosa succede se la vista a cui sto tornando è una vista a schede e il mio unico modo per reindirizzare è tramite ... RedirectPermanent ("~ /RefTarget/Index/#users");.......#users è una delle tre schede ... come eseguire la mia operazione di messaggio viewBag? – mkell

+0

Stai facendo di nuovo un reindirizzamento. Avrei impostato la scheda selezionata sul viewmodel o nel viewbag e controllato questo valore nella vista per selezionare la scheda corretta durante il rendering. – Kristof

0

Si può provare in questo modo anche

controller

public ActionResult Test() 
    { 
ViewBag.controllerValue= "testvalue"; 
.................. 
    } 

View - definire inizio pagina rasoio @{string testvalue= (string)ViewBag.controllerValue;}

$(function() { 
     var val= '@testvalue'; 
}); 
Problemi correlati