Cela a pris du temps, mais j'ai trouvé une solution géniale. Comme la solution Keith fonctionne pour beaucoup de gens, mais dans certaines situations ce n'est pas le meilleur, parce que parfois vous voulez que votre application passe par le processus du contrôleur pour le rendu de la vue, et La solution de Keith rend juste la vue avec un modèle donné Je présente ici une nouvelle solution qui fonctionnera normalement.
étapes générales:
- créer une classe utilitaire
- Créer un contrôleur factice en vue factice
- Dans votre
aspx
ou master page
, appelez la méthode utilitaire pour rendre partielle passage du contrôleur, vue et si vous avez besoin, le modèle à rendre (comme un objet),
Vérifions-le de près dans cet exemple
1) Créer une classe appelée MVCUtility
et créer 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éer une vue factice appelé PartialRender.cshtml
(vue rasoir) pour la DummyController
avec le contenu suivant, notez qu'il effectuera une autre Render action en utilisant l'assistant Html
@model Portal.MVC.MvcUtility.RenderActionViewModel
@{Html.RenderAction(Model.ActionName, Model.ControllerName, Model.RouteValues);}
3) Maintenant, il suffit de mettre dans votre MasterPage
ou aspx
fichier, pour rendre partiel une vue que vous voulez. Notez que c'est une excellente réponse lorsque vous avez plusieurs vues de rasoir que vous voulez mélanger avec vos pages MasterPage
ou aspx
.(Suposing nous avons un PartialView appelé Connectez-vous pour le contrôleur Accueil
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { }); %>
ou si vous avez un modèle pour passer dans l'action
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { Name="Daniel", Age = 30 }); %>
Cette solution est grande, n'utilise pas appel ajax , qui ne provoquera pas rendu différé pour les vues imbriquées, il ne fait pas une nouvelle demande Web alors ne vous apportera pas une nouvelle session, et traitera la méthode pour récupérer le ActionResult pour la vue que vous voulez, cela fonctionne sans passer aucun modèle
Merci àUsing MVC RenderAction within a Webform
J'ai le même problème - Html.RenderPartial ne peuvent pas travailler WebForms, mais il devrait toujours y avoir un moyen de le faire. – Keith