2009-03-11 14 views
5

Estoy un poco confundido al tratar de llevar una lista de categorías a una barra de navegación en un MasterPageView en la última versión del marco ASP.NET MVC. Tengo 0 experiencia con parciales hasta el momento (esto se suma a la confusión).ASP.NET MVC - MasterPageView y RenderPartials - Confusión

¿Debo usar esta variante de RenderPartial?

HtmlHelper.RenderPartial(string partialViewName, object model) 

No he podido encontrar ningún buen ejemplo de este método. Por convención, ¿no hay ningún modelo asociado con el MasterPageView, verdad? Entonces, ¿cuál es la forma correcta de insertar o extraer datos en un "parcial" de MasterPageView?

Suponiendo que este método es absolutamente va por el camino equivocado:

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

Respuesta

0

me gustaría utilizar Html.RenderAction() en su lugar y devolver una vista parcial de la misma.

+0

dónde sacas el método RenderAction() desde? ¿Es esto una cosa Contrib? – BuddyJoe

+0

Podría estar en MVC Futures en CodePlex. No recuerdo a mano (no cerca de donde pueda verificar ahora) –

1
public ActionResult NavBar() 
{ 

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


      return View(lst); 
} 

en su llamada parcial

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

y hacer todo su prestación ui aquí

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

se puede hacer ActionResult llamadas en sus controladores

+0

En cada uno de mis controladores, ¿tengo que hacer esta llamada NavBar()? o heredarlo en ... eso no parece correcto. – BuddyJoe

+0

lo que hago es crear BaseController que hereda el Controlador y poner todas mis llamadas de códigos parciales reutilizables en el controlador base y hacer que todos mis controladores hereden el BaseController. De esta forma, todos los controladores tienen acceso a ese parcial. – Ayo

+0

No, no es necesario. simplemente ponga su código de navegación @ archivo de página maestra – Funky81

1

diría que ya que es la página maestra probablemente tenga que almacenar sus datos que está pasando en ViewData con tring key. Si fuera una página de vista normal, sería mejor tener una página fuertemente tipada, pero este es un caso diferente. Así que es probable que hacer algo esto en su controlador:

ViewData["MasterPageData"] = FunctionToGetData(); 

Y a continuación, en la página maestra o menos así:

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

Luego, en el control, proceso que lo haría en una página normal vista:

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

process as normal... 

no he tenido que pasar los datos a una página maestra todavía, pero así es como yo creo que lo harías. Más información here.

EDIT: Se modificó un poco para reflejar lo que estoy haciendo en mi proyecto actual.

+0

+1 buena información. Déjame preguntarte esto en tu ejemplo ... tus datos pasados ​​en el modelo [objeto]. ¿Cómo lo hace referencia desde el lado parcial? El tutorial muestra el método ViewData. – BuddyJoe

+0

Editado (con suerte) a su pregunta. –

7

¿No quiere que su página maestra tenga viewdata? Se podía resolver por tener una clase de datos vista base de que todas sus otras clases heredan de ViewData ...

BaseViewData.cs - esto es una clase viewdata que todas las otras clases ViewData heredarán de

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

Ahora en su página Site.Master simplemente tenga

<%@ 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) %> 

Esto podría afectar significativamente la arquitectura de su aplicación, pero no es necesariamente algo malo.

HTHS, Charles

+0

Sí, sigo este método. –

+0

+1 Hmmm. Esto podría funcionar ... y al menos ahora conozco el "ViewData.Model". sintaxis. No estoy seguro de por qué no había visto eso todavía. – BuddyJoe

+0

El proyecto Kigg lo hace de esta manera, estoy a punto de implementarlo. Dónde y cómo se carga el Modelo para que la página maestra pueda hacer esto: ViewData.Model.Titl – Picflight