2012-11-24 19 views
19

Ho un requisito per visualizzare un messaggio che conferma l'aggiornamento di un database in un'applicazione ASP.NET MVC. Attualmente l'applicazione mostra solo messaggi (utilizzando un helper ValidationSummary) quando si verifica un errore. In caso di operazione riuscita, l'applicazione attualmente reindirizza a un punto adatto nella navigazione.ASP.NET MVC: Come visualizzare il messaggio di conferma del successo dopo l'elaborazione lato server

Gli obiettivi sono:

  • Visualizzare il messaggio di conferma in modo appropriato
  • Ridurre al minimo le azioni degli utenti necessari per procedere dopo aver letto un messaggio
  • Evitare un posto/andata e ritorno in più per visualizzare il messaggio
  • Ridurre al minimo lo sforzo di sviluppo e rischio l'inserimento di un messaggio in più punti nell'applicazione

La mia preferenza sarebbe una sorta di visualizzazione dei messaggi del tipo di suggerimento vicino al pulsante di invio e quindi un meccanismo per rimuovere il messaggio e procedere con il reindirizzamento esistente dopo il successo.

Questo sembra suggerire una chiamata Ajax piuttosto che il POST HTTP esistente per inviare il modulo. Come andrei su questo?

risposta

35

userei TempData["key"]

Questo è come ViewData["key"] tuttavia i dati persiste per la prossima HttpRequest e è disposto automaticamente da asp.net dopo questo

Quindi è possibile farlo.

Action Controller

[HttpPost] 
public ActionResult SomePostAction(SomeViewModel vm) 
{ 
    if(ModelState.IsValid) // Is User Input Valid? 
    { 
     try 
     { 
      CommitData(); 
      TempData["UserMessage"] = new MessageVM() { CssClassName = "alert-sucess", Title = "Success!", Message = "Operation Done." }; 
      return RedirectToAction("Success"); 
     } 
     catch(Exception e) 
     { 
      TempData["UserMessage"] = new MessageVM() { CssClassName = "alert-error", Title = "Error!", Message = "Operation Failed." }; 
      return RedirectToAction("Error"); 
     } 

    } 

    return View(vm); // Return View Model with model state errors 
} 

_Layout.cshtml

<!DOCTYPE html> 
    <html> 
    <head> 

    </head> 
    <body> 
     @if(TempData["UserMessage"] != null) 
     { 
      var message = (MessageVM)TempData["UserMessage"]; 
      <div class="alert @message.CssClassName"> 
       <strong>@message.Title</strong> 
       @message.Message 
      </div> 
     } 
      @RenderBody() 
    </body> 
</html> 

Ulteriori informazioni: http://www.devcurry.com/2012/05/what-is-aspnet-mvc-tempdata.html

+0

Mi piace perché mi dà la possibilità di mostrare il messaggio sulla pagina a cui reindirizzo dopo l'aggiornamento riuscito. Se seguo questo approccio, un'opzione potrebbe essere quella di mostrare il messaggio in un pannello del tipo di descrizione che scompare automaticamente dopo un tempo predeterminato, senza richiedere ulteriori azioni da parte dell'utente. Ha anche un basso impatto in termini di refactoring richiesto. Grazie! –

+0

Mi piace la tua risposta, la mia unica preoccupazione è il reindirizzamento all'errore. Questo quindi impedirebbe all'utente di inviare il proprio post. O forse è questa l'idea? Il successo è sicuro, blocca le risposte doppie., Ma l'errore potrebbe richiedere una nuova presentazione. – Tod

+0

Ciao @Tod Vedo il tuo punto, tuttavia ritengo che le tue preoccupazioni riguardino più la convalida dei dati. Se c'è un problema con i dati inviati dall'utente, questo sarebbe gestito usando 'ModelState.IsValid' e quindi si può' restituire View (vm) 'aggiornerò la mia risposta per essere un po 'più chiara. – SimonGates

9

Su un'operazione di successo, basta memorizzare la descrizione del messaggio di successo in ViewBag come come

ViewBag.successMessage="Success" 

poi tenuto cercare la viewB il valore dell'ag è nullo o no? tramite javascript, se spettacolo non nullo il messaggio in Div

if('@ViewBag.successMessage'!="") 
{ 
    $('#divSuccessMessage').show(); 
} 
else 
{ 
    $('#divSuccessMessage').hide(); 
} 

default nel caricamento della pagina nasconde il div

+0

Grazie, ora vedo che è più semplice di quanto pensassi. Per gestire il reindirizzamento a un'altra pagina dopo aver visualizzato il messaggio di successo, suppongo di poter aggiungere un gestore onclick al div del messaggio. –

Problemi correlati