2011-01-16 5 views
1

Ich versuche etwas wie Ruby on Rail's ActionDispatch::Flash zu implementieren, um Nachrichten an die nächste Seitenanforderung zu übergeben. Der Ansatz, den ich nehmen möchte, besteht darin, ein Paar (Teilansichtsname, Modellobjekt) im Sitzungskontext zu speichern und es auf der Masterseite zu rendern, wenn die Anforderung zum Anzeigen der Flash-Nachricht gerendert wird.Wie man eine Teilansicht nach Namen innerhalb einer Masterseite rendern kann

Inside my HttpApplication Unterklasse habe ich jetzt:

public class Global : System.Web.HttpApplication 
{ 
    public class FlashStuff 
    { 
     private string flashViewName; 
     private object model; 

     public FlashStuff(string flashViewName, object model) 
     { 
      this.flashViewName = flashViewName; 
      this.model = model; 
     } 

     public string FlashViewName 
     { 
      get { return flashViewName; } 
     } 

     public object Model 
     { 
      get { return model; } 
     } 
    } 

    internal static void Flash(string flashViewName, object model) 
    { 
     HttpContext.Current.Session.Add("flash", new FlashStuff(flashViewName, model)); 
    } 

    //... 
} 

Ich habe auch ein BookmarkController mit einer Aktion ein Lesezeichen hinzuzufügen:

[HandleError] 
public class BookmarkController : Controller 
{ 
    public ActionResult Add() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Add(Bookmark_AddModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      //... 

      Global.Flash("BookmarkAddedFlash", model); 
      return RedirectToAction("Index", "Bookmark"); 
     } 

     //... 
    } 

    //... 
} 

In meiner Masterseite Ich möchte jetzt so etwas wie:

 <% var session = HttpContext.Current.Session; 
      if (session["flash"] != null) 
      { 
       var flashStuff = (MyApp.Web.Global.FlashStuff)session["flash"]; %> 
       <div><!-- render in here --></div> 
     <%  session.Remove("flash"); 
      } %> 

, um die Teilansicht zu rendern, die mit n angegeben wurde wenn Global # Flash aufgerufen wurde.

Ich mag eine Ansicht für die Flash-Mitteilung verwenden, anstatt die Nachricht als string im Sitzungskontext zu speichern, weil ich die URL in der Nachricht enthalten sein soll:

<%-- BookmarkAddedFlash.ascx --%> 
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Web.Models.Bookmark_AddModel>" %> 
<%: Html.DisplayTextFor(m => m.Url) %> was successfully bookmarked. 

Und ich möchte nur machen, die Ansicht, wenn die nachfolgende Anfrage gemacht wird; d. h. eine Anfrage setzt die Flash-Nachricht und die nachfolgende Anfrage rendert sie.

Wie mache ich das?

Antwort

1

Das Äquivalent von RoRs Flash-Objekt in ASP.NET MVC heißt TempData.

public ActionResult Action1() 
{ 
    TempData["message"] = "some message"; 
    return RedirectToAction("action2"); 
} 

public ActionResult Action2() 
{ 
    var message = TempData["message"] as string; 
    return View(); 
} 

oder direkt in der Ansicht Action2 verwenden:

<div><%: TempData["message"] %></div> 

Intern TempData verwendet das Session-Objekt zum Speichern von Daten, aber es automatisch nach einer Umleitung für ungültig erklärt wird. Was Sie also implementieren möchten, existiert bereits.

+0

'TempData' scheint zu sein, was ich suche, um die Daten zu speichern. Ich möchte jedoch eine Teilansicht in der Masterseite mit dem Namen der Teilansicht rendern. Wie mache ich das? –

+0

Sie könnten '<% Html.RenderPartial (" NameOfYourPartialView "); %> 'oder durch Angabe des vollständigen Pfades' <% Html.RenderPartial ("~/Views/Home/Foo.ascx"); %> '. Eine andere Sache, die du dir ansehen kannst, ist die Kinderaktion mit Html.Action und Html.RenderAction Helfern. Phil Haack schrieb einen schönen Blog-Post über sie: http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx –

+0

Das hat funktioniert! Vielen Dank. –