2011-06-09 20 views
51

¿Cómo puedo crear un controlador y modelo individual para una vista parcial? Quiero poder ubicar esta vista parcial en cualquier parte del sitio, así que necesita su propio controlador. Estoy al corriente haciendo que el parcial por loCrear controlador para vista parcial en ASP.NET MVC

@Html.Partial("_Testimonials") 
+0

http://www.c-sharpcorner.com/article/html-action-and-html-renderaction-in-Asp-Net-mvc/ –

Respuesta

93

Por qué no usar Html.RenderAction()?

entonces se podría poner el siguiente en cualquier controlador (incluso la creación de un nuevo controlador para ello):

[ChildActionOnly] 
public ActionResult MyActionThatGeneratesAPartial(string parameter1) 
{ 
    var model = repository.GetThingByParameter(parameter1); 
    var partialViewModel = new PartialViewModel(model); 
    return PartialView(partialViewModel); 
} 

Posteriormente, se podría crear una nueva vista parcial y tener su PartialViewModel ser lo que hereda de.

Para Navaja, el bloque de código en la vista se vería así:

@{ Html.RenderAction("Index", "Home"); } 

Para el WebFormsViewEngine, se vería así:

<% Html.RenderAction("Index", "Home"); %> 
+3

lo único con rendección es Por supuesto que hace una segunda solicitud, mientras que la parte imparcial lo hace como parte de la misma solicitud inicial. 9/10 veces no importará, pero vale la pena señalarlo. ver http://stackoverflow.com/questions/719027/renderaction-renderpartial para un pequeño fondo –

+0

En vbhtml aparece el error "La expresión no produce un valor" en '@ Html.RenderAction (" MyActionThatGeneratesAPartial "," Home ") ' – KyleMit

+0

@kylemit es tu código así? '@ {Html.RenderAction (" Índice "," Inicio "); } ' –

8

Si fuera yo, me basta con crear un nuevo controlador con una sola acción y luego utilice RenderAction en lugar de parcial:

// Assuming the controller is named NewController 
@{Html.RenderAction("ActionName", 
        "New", 
         new { routeValueOne = "SomeValue" }); 
} 
+3

En el fragmento de código no sería mejor use 'RenderAction' como describió en su respuesta? – Martin

+0

Tengo que decir que este es el único ejemplo que he encontrado hasta ahora donde el parcial encapsula su propia funcionalidad, así que puedo poner una sola línea en cualquier lugar y hacer que funcione sin modificaciones para otras vistas/controladores, etc. – djack109

8

No necesita su propio controlador. Puede usar

@Html.Partial("../ControllerName/_Testimonials.cshtml") 

Esto le permite representar el parcial desde cualquier página. Solo asegúrate de que la ruta relativa sea la correcta.

+4

¿por qué se va a votar? La suposición era que se necesitaba un controlador por separado para hacer una parcial en cualquier página del sitio. Esto no es verdad. Puede renderizar un parcial desde cualquier controlador. Esta es una respuesta válida – Slick86

+2

Simplemente adivinando, quien haya votado negativamente probablemente desee un modelo de vista para ir con la vista parcial, y deje la creación de eso en un controlador dedicado separado. Su ejemplo funciona muy bien sin viewmodel, pero obliga a los controladores actuales (todos) a crear/poblar un modelo de vista y pasarlo a la –

+0

parcial. No olvide la extensión: Html.Partial ("../ControllerName/_Testimonials.cshtml ") – JoshYates1980

2

Lo más importante es que la acción creada debe devolver vista parcial, ver a continuación.

public ActionResult _YourPartialViewSection() 
{ 
    return PartialView(); 
} 
Cuestiones relacionadas