Cela a pris un certain temps, mais j'ai trouvé une excellente solution. La solution de Keith fonctionne pour beaucoup de gens, mais dans certaines situations, ce n'est pas la meilleure, parce que parfois vous voulez que votre application passer par le processus du contrôleur pour le rendu de la vue, et La solution de Keith rend simplement la vue avec un modèle donné. Je présente ici une nouvelle solution qui exécutera le processus normal.
Étapes générales :
- Créer une classe Utilitaire
- Créer un contrôleur fictif avec une vue fictive.
- Dans votre
aspx
o master page
Dans le cas de la méthode de rendu partiel, appelez la méthode utilitaire en passant le contrôleur, la vue et, si nécessaire, le modèle à rendre (sous forme d'objet),
Vérifions-le de près dans cet exemple
1) Créez une classe appelée MVCUtility
et créez les méthodes suivantes :
//Render a partial view, like Keith's solution
private static void RenderPartial(string partialViewName, object model)
{
HttpContextBase httpContextBase = new HttpContextWrapper(HttpContext.Current);
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Dummy");
ControllerContext controllerContext = new ControllerContext(new RequestContext(httpContextBase, routeData), new DummyController());
IView view = FindPartialView(controllerContext, partialViewName);
ViewContext viewContext = new ViewContext(controllerContext, view, new ViewDataDictionary { Model = model }, new TempDataDictionary(), httpContextBase.Response.Output);
view.Render(viewContext, httpContextBase.Response.Output);
}
//Find the view, if not throw an exception
private static IView FindPartialView(ControllerContext controllerContext, string partialViewName)
{
ViewEngineResult result = ViewEngines.Engines.FindPartialView(controllerContext, partialViewName);
if (result.View != null)
{
return result.View;
}
StringBuilder locationsText = new StringBuilder();
foreach (string location in result.SearchedLocations)
{
locationsText.AppendLine();
locationsText.Append(location);
}
throw new InvalidOperationException(String.Format("Partial view {0} not found. Locations Searched: {1}", partialViewName, locationsText));
}
//Here the method that will be called from MasterPage or Aspx
public static void RenderAction(string controllerName, string actionName, object routeValues)
{
RenderPartial("PartialRender", new RenderActionViewModel() { ControllerName = controllerName, ActionName = actionName, RouteValues = routeValues });
}
Créer une classe pour passer les paramètres, je vais appeler ici RendeActionViewModel (vous pouvez créer dans le même fichier de la classe MvcUtility)
public class RenderActionViewModel
{
public string ControllerName { get; set; }
public string ActionName { get; set; }
public object RouteValues { get; set; }
}
2) Maintenant, créez un contrôleur nommé DummyController
//Here the Dummy controller with Dummy view
public class DummyController : Controller
{
public ActionResult PartialRender()
{
return PartialView();
}
}
Créez une vue factice appelée PartialRender.cshtml
(razor view) pour le DummyController
avec le contenu suivant, notez qu'il effectuera une autre action de rendu en utilisant l'aide Html.
@model Portal.MVC.MvcUtility.RenderActionViewModel
@{Html.RenderAction(Model.ActionName, Model.ControllerName, Model.RouteValues);}
3) Maintenant, mettez ceci dans votre MasterPage
o aspx
pour rendre partiellement la vue que vous souhaitez. Notez que c'est une excellente réponse lorsque vous avez plusieurs vues de rasoir que vous voulez mélanger avec votre MasterPage
o aspx
pages. (Supposons que nous ayons une PartialView appelée Login pour le contrôleur Home).
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { }); %>
ou si vous avez un modèle à passer dans l'action
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { Name="Daniel", Age = 30 }); %>
Cette solution est géniale, n'utilise pas d'appel ajax qui ne provoquera pas de rendu tardif pour les vues imbriquées, il ne fait pas de nouvelle WebRequest donc il ne vous apportera pas une nouvelle session et il traitera la méthode pour récupérer l'ActionResult pour la vue que vous voulez, il fonctionne sans passer de modèle
Merci à Utilisation de MVC RenderAction dans un formulaire Web
0 votes
J'ai le même problème - Html.RenderPartial ne peut pas fonctionner sur les WebForms, mais il devrait quand même y avoir un moyen de le faire.