2008-09-07 23 views
8

Aquí hay un escenario: digamos que tengo un sitio con dos controladores responsables de mostrar diferentes tipos de contenido: páginas y artículos. Necesito insertar una Vista parcial en mi página maestra que enumerará las páginas y los artículos filtrados con algunos criterios y se mostrarán en cada página. No puedo configurar Model en mi página maestra (¿estoy en lo cierto?). ¿Cómo resuelvo esta tarea usando Html.RenderPartial?Html.RenderPartial call from masterpage

[EDITAR] Sí, probablemente crearía vistas parciales separadas para la lista de artículos y páginas, pero aún así, hay una barrera que no puedo y no debo establecer el modelo en la página maestra. Necesito de alguna manera decir "aquí están las páginas" como argumento para mi renderpartial, y también para artículos. El concepto completo de renderpartial con datos de la base de datos en las páginas maestras es un poco borroso para mí.

Respuesta

0

La propiedad ViewData Model solo se debe utilizar para el contenido que está viendo/editando en la sección principal de la interfaz de usuario.

Es posible que otras partes de la vista necesiten algunos datos presentes en ViewData, así que simplemente agréguelos al diccionario.

Acabo de pasar datos del diccionario como este: ViewData ["articles"] al parcial. (o ViewData.Get() de MvcContrib).

También puede consultar el patrón SubController recientemente implementado implementado en MvcContrib.

0

sí, esto es correcto. pero echemos un vistazo a este escenario: en las vistas que están relacionadas con los artículos, tendría ViewData ["artículo"], y en las vistas relacionadas con las páginas, tengo ViewData ["páginas"], pero no tengo ambos artículos y páginas disponibles todo el tiempo. Por lo tanto, si añado:

Html.RenderPartial ("articlesView", ViewData [ "artículos"])

Html.RenderPartial ("pagesView", ViewData [ "páginas"])

a mi página maestra, tendré una excepción lanzada en cada página en la que ViewDataDictionary no contenga artículos ni páginas.

Al menos, así es como yo lo veo.

1

Tuve un similar post y se me ocurrió un modelo de objeto para manejarlo.

ODIO las vistas no fuertemente tipadas, así que seguí este enfoque y está funcionando bien.

2

¿Qué hay de la creación de un método de extensión HtmlHelper que le permite llamar a un resultado de vista parcial en una acción en el controlador.

Algo así como

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); 
} 

usted podría entonces utilizar esto en su página maestra como

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

y en su controlador el método apropiado

public PartialViewResult RenderPartial() 
{ 

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

Bueno, eso es mi 2 centavos de todos modos

0

La forma en que manejo esto es mediante el uso de un modelo BaseView. Todas las Vistas están fuertemente tipadas contra un modelo de vista que hereda de BaseViewModel.

La clase BaseViewModel tiene toda la información que necesita la página maestra. Así que para la navegación sus BaseViewModel pueden tener este aspecto:

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

En su MasterPage y PartialViews, se puede emitir el Modelo de BaseViewModel y acceder a la propiedad NavigationsItems.

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

Ésta es una respuesta muy tardía , pero llegué a esta página mientras busqué en Google, así que es probable que otra persona vea esta pregunta (y mi respuesta) también.

La forma en que he solucionado este problema es mediante el uso de un simple script jQuery para cargar un PartialView y ejecutar su código de controlador. Muestra a continuación.

<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> 

El gran inconveniente de este enfoque es que el cliente tiene que tener secuencias de comandos activado para que funcione (por lo que es muy poco amigable SEO). Si eso es algo con lo que puedes vivir, funciona bien. Solo lo uso en un sitio de intranet donde sé que cada cliente tiene JavaScript activado y no tengo que preocuparme por los bots de Google.