2009-03-11 9 views
5

Sono un po 'confuso nel provare a portare un elenco di Categorie in una barra di navigazione su un oggetto MasterPageView nell'ultima versione del framework ASP.NET MVC. Ho 0 esperienze con Partials finora (questo aggiunge confusione).ASP.NET MVC - MasterPageView e RenderPartials - Confusione

Devo utilizzare questa variante di RenderPartial?

HtmlHelper.RenderPartial(string partialViewName, object model) 

Non sono riuscito a trovare alcun buon esempio di questo metodo. Per convenzione non esiste un modello associato a MasterPageView, giusto? Allora, qual è il modo corretto per spingere o tirare i dati in un "parziale" da MasterPageView?

Supponendo che questo metodo sia assolutamente andare sulla strada sbagliata:

<div id="navigation"> 
     <% 
      CategoryRepository cr = new CategoryRepository(); 
      IList<Category> lst = cr.GetCategories(); 
      Html.RenderPartial("NavBar", lst); 
     %> 
    </div> 

risposta

0

avrei usato Html.RenderAction() invece e restituire una vista parziale da esso.

+0

Dove si ottiene il metodo RenderAction() da? Questa è una cosa di Contrib? – BuddyJoe

+0

Potrebbe essere in MVC Futures su CodePlex. Non ricordo remotamente (non vicino a dove posso controllare adesso) –

1
public ActionResult NavBar() 
{ 

      CategoryRepository cr = new CategoryRepository(); 
      IList<Category> lst = cr.GetCategories(); 


      return View(lst); 
} 

sul vostro nominativo parziale

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<%@ Import Namespace="app.Models" %> 

e farai ogni tuo resa ui qui

<div id="navigation"> 
     <% 
      Html.RenderPartial("NavBar"); 
     %> 
    </div> 

si può fare ActionResult chiamate nei controller

+0

Su ognuno dei miei controller devo fare questa chiamata NavBar()? o ereditarlo in ... non sembra giusto. – BuddyJoe

+0

ciò che faccio è creare BaseController che erediti Controller e metta tutte le mie chiamate di codice parziale riusabili nel controller di base e che tutti i miei controller ereditino il BaseController. In questo modo tutti i controllori hanno accesso a quel parziale. – Ayo

+0

No, non è necessario. inserisci il tuo codice di navigazione sul file masterpage – Funky81

1

Direi che dal momento che è la pagina master probabilmente dovresti memorizzare i dati che stai passando in ViewData con as chiave tring. Se si trattava di una normale pagina di visualizzazione, sarebbe meglio avere una pagina fortemente tipizzata, ma questo è un caso diverso. Così si sarebbe probabilmente fare qualcosa di questo nel controller:

ViewData["MasterPageData"] = FunctionToGetData(); 

E poi sulla pagina master o meno così:

<% 
    if (ViewData["MasterPageData"] != null) 
    { 
     Html.RenderPartial("ControlName.ascx", ViewData); 
    } 
%> 

Poi nel controllo, processo di come si farebbe in una normale pagina di visualizzazione:

<% var categories = (CastIfNeeded)ViewData["MasterPageData"]; %> 

process as normal... 

non ho avuto per passare i dati ad una pagina master ancora, ma è così che penserei lo faresti. Maggiori informazioni here.

MODIFICA: l'ho modificata un po 'per riflettere quello che sto facendo nel mio progetto corrente.

+0

+1 buone informazioni. Lascia che ti chieda questo nel tuo esempio ... i tuoi dati di passaggio come modello [oggetto]. Come lo fai riferimento dal lato parziale? Il tutorial mostra il metodo ViewData. – BuddyJoe

+0

Modificato per (si spera) per rispondere alla tua domanda. –

7

Non vuoi che la tua pagina master abbia i dati di visualizzazione? Si potrebbe risolverlo da avere una classe di dati vista di base che tutti i tuoi altre classi viewdata ereditano da ...

BaseViewData.cs - questa è una classe viewdata che tutte le altre classi viewdata erediteranno da

public class BaseViewData 
{ 
    public string Title { get; set; } 
    public string MetaKeywords { get; set; } 
    public string MetaDescription { get; set; } 
    IList<Category> NavCategoryList { get; set; } 
} 

ora nella tua pagina Site.master semplicemente

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<BaseViewData>" %> 

<title><%=ViewData.Model.Title %></title> 
<meta name="keywords" content="<%=ViewData.Model.MetaKeywords %>" /> 
<meta name="description" content="<%=ViewData.Model.MetaDescription %>" /> 

<%= Html.RenderPartial("NavBar", ViewData.Model.NavCategoryList) %> 

questo potrebbe avere un impatto significativo vostra architettura applicativa, ma non è necessariamente una cosa negativa.

HTHS, Charles

+0

Sì, seguo questo metodo. –

+0

+1 Hmmm. Questo potrebbe funzionare ... e almeno ora conosco il "ViewData.Model". sintassi. Non sono sicuro del motivo per cui non l'avevo ancora visto. – BuddyJoe

+0

Il progetto Kigg fa così, sto per implementarlo. Dove e come si carica il Modello in modo che la pagina master possa eseguire questa operazione: ViewData.Model.Titl – Picflight