2008-09-07 14 views
8

Hier ist ein Szenario: Sagen wir, ich habe Website mit zwei Controllern verantwortlich für die Anzeige verschiedener Arten von Inhalten - Seiten und Artikel. Ich muss Partial View in meine Masterpage einbetten, die nach bestimmten Kriterien gefilterte Seiten und Artikel auflistet und auf jeder Seite angezeigt wird. Ich kann Model nicht auf meiner Masterpage einrichten (habe ich Recht?). Wie löse ich diese Aufgabe mit Html.RenderPartial?Html.RenderPartial Anruf von Masterpage

[EDIT] Ja, ich würde wahrscheinlich separate Teilansichten für die Auflistung von Artikeln und Seiten erstellen, aber immer noch gibt es eine Barriere, die ich kann und sollte nicht Modell auf Masterpage setzen. Ich muss irgendwie sagen "Hier sind die Seiten" als Argument für mein Renderpartial und auch für Artikel. Das gesamte Konzept von renderpartial mit Daten aus der Datenbank in masterpages ist für mich ein wenig verschwommen.

Antwort

0

Die ViewData Model-Eigenschaft sollte nur für den Inhalt verwendet werden, den Sie im Hauptabschnitt der Benutzeroberfläche anzeigen/bearbeiten.

Andere Teile der Ansicht benötigen möglicherweise einige Daten in ViewData, fügen Sie diese einfach zum Wörterbuch hinzu.

Ich würde nur Daten aus dem Wörterbuch wie folgt übergeben: ViewData ["Artikel"] zu den partiellen. (oder ViewData.Get() von MvcContrib).

Sie können auch das kürzlich implementierte SubController-Muster betrachten, das in MvcContrib implementiert wurde.

0

ja, das ist richtig. Aber schauen wir uns dieses Szenario an: auf Ansichten, die mit Artikeln verwandt sind, hätte ich ViewData ["article"] und in Ansichten, die sich auf Seiten beziehen, habe ich ViewData ["pages"], aber ich habe nicht beide Artikel und Seiten sind jederzeit verfügbar. Also, wenn ich hinzufügen:

Html.RenderPartial ("articlesView", Viewdata [ "Artikel"])

Html.RenderPartial ("pagesView", Viewdata [ "Seiten"])

meiner masterpage, auf jeder Seite, auf der ViewDataDictionary nicht beide Artikel und Seiten enthält, wird eine Ausnahme ausgelöst.

Zumindest so sehe ich es.

1

Ich hatte eine similar post und kam mit einem Objektmodell, um damit umzugehen.

Ich HATE die nicht stark typisierten Ansichten so ging mit diesem Ansatz und es funktioniert gut.

2

So erstellen Sie eine HtmlHelper-Erweiterungsmethode, mit der Sie ein Teilansichtsergebnis für eine Aktion auf dem Controller aufrufen können.

So etwas wie

public static void RenderPartialAction<TController>(this HtmlHelper helper, Func<TController, PartialViewResult> actionToRender) 
    where TController : Controller, new() 
{ 
    var arg = new TController {ControllerContext = helper.ViewContext.Controller.ControllerContext}; 
    actionToRender(arg).ExecuteResult(arg.ControllerContext); 
} 

Sie könnte dies dann in der Masterseite verwenden, wie

<% Html.RenderPartialAction((HomeController x) => x.RenderPartial()) %> 

und in Ihrem Controller die entsprechende Methode

public PartialViewResult RenderPartial() 
{ 

    return PartialView("~/Path/or/View",_homeService.GetModel()) 
} 

Gut, dass meine 2 Cent jedenfalls

0

Die Art, wie ich das handhabe, ist mit einem BaseViewModel. Alle Ansichten werden stark gegen ein Ansichtsmodell typisiert, das von BaseViewModel erbt.

Die BaseViewModel-Klasse enthält alle von der MasterPage benötigten Informationen. So für die Navigation Ihrer BaseViewModel können wie folgt aussehen:

public class BaseViewModel 
{ 
    public BaseViewModel() 
    { 
     NavigationItems = RetrieveNavigationItemsFromModel(); 
    } 
    public List<NavItems> NavigationItems {get; set;} 
} 

In Ihrer Masterpage und PartialViews, können Sie das Modell zu BaseViewModel gegossen und die NavigationsItems Eigenschaft zugreifen.

<ul> 
<% foreach (NavItem ni in (Model as BaseViewModel).NavigationItems) { %> 
    <li> 
     <a href="<%= ni.Url %>" alt="<%= ni.Alt%>"><%= ni.DisplayText %></a> 
    </li> 
<% } %> 
</ul> 
0

Dies ist eine sehr späte Antwort , aber ich bin auf diese Seite gekommen, während ich gegoogelt habe - es ist also wahrscheinlich, dass jemand anderes diese Frage (und meine Antwort) sehen wird.

Die Art, wie ich dieses Problem bearbeitet habe, ist mit einem einfachen jQuery-Skript, um eine PartialView zu laden und den Controller-Code auszuführen. Beispiel unten.

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 

    <script type="text/javascript"> 
      $(document).ready(function() { 
      $("#applicationForm").load("/Home/ApplicationForm"); 
      }); 
    </script> 

    <div id="applicationForm" /> 

</asp:Content> 

Der große Nachteil dieses Ansatzes besteht darin, dass der Client-Scripting für sie arbeiten aktiviert haben muss (so ist es wirklich SEO unfreundlich). Wenn das etwas ist, mit dem man leben kann, funktioniert es gut. Ich verwende es nur auf einer Intranetseite, wo ich weiß, dass jeder Client JavaScript aktiviert hat und ich mich nicht um Googles Bots kümmern muss.