Html.RenderPartial(..) est pratique mais cette methode implique que la vue partielle inserée connaisse à l’avance son controller ou il faut qu’en amont la ViewPage stocke les datas qui seront affichées eventuellement par le controle en les passant en paramètre.
Voici une methode qui permet de selectionner le controller qui permettra de rendre la vue partielle :
public static void RenderPartial<T>(this HtmlHelper helper, Expression<Action<T>> action)
where T : Controller
{
var controller = MvcApplication.Container.Resolve<T>();
var body = action.Body as MethodCallExpression;
var controllerContext = new ControllerContext(helper.ViewContext.RequestContext, controller);
bool result = controller.ActionInvoker.InvokeAction(controllerContext, body.Method.Name);
}
Il faut bien sur que MvcApplication ait une propriété statique integrant le container Unity, voici comment appeler la methode :
<% Html.RenderPartial<CatalogController>(i => i.ShowCategories()); %>
Affiche par exemple la liste des categories d’un catalogue de produits, le controller etant comme ceci :
public class CatalogController : Controller
{
[Dependency]
public ICatalogService CatalogService { get; set; }
public ActionResult ShowCategories()
{
return View("~/views/catalog/categories.ascx", CatalogService.GetCategories());
}
}
L’avantage de cette methode est que la vue partielle est rendue par le controlleur avec lequel on peut acceder proprement aux couches de services.
Je me suis inspiré de la methode Microsoft.Web.Mvc.HtmlHelpers.RenderAction<> que l’on peut trouver dans le projet aspnet rc futures sur codeplex à l’adresse suivante :
http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=22359
Aucun commentaire:
Enregistrer un commentaire