2015-08-27 1 views
4

Dans une application Web MVC 5 que je développe, par souci de performance je suis Clearing les moteurs de vue et en ajoutant que le RazorViewEngine dans Global.asax.cs en utilisant ViewEngines.Engines.Clear(); et il brise les styles dans le plan du site mvc mie de painMoteurs d'échange Voir toutes les offres MVC casse sitemap styles panés

Avant

enter image description here

Après

enter image description here

mon plan Sitemap vue partielle (SiteMapPathHelperModel.cshtml) ressemble

@model MvcSiteMapProvider.Web.Html.Models.SiteMapPathHelperModel 
@using System.Web.Mvc.Html 
@using System.Linq 
@using MvcSiteMapProvider.Web.Html.Models 
<ol class="breadcrumb"> 
    @foreach (var node in Model) 
    { 
     if (node == Model.Last()) 
     { 
      <li class="active"> 
       <strong>@Html.DisplayFor(m => node)</strong> 
      </li> 
     } 
     else 
     { 
      <li> 
       @if (node.Title == "Home") 
       { 
        <a href="/"><i class="fa fa-lg fa-home"></i></a> 

       } 
       else 
       { 
        @Html.DisplayFor(m => node) 
       } 
      </li> 
     } 
    } 
</ol> 

D'une certaine manière, il semble être en train de revenir à une autre application que les vues sous> partials partagées> Modèles d'affichage

Quelle pourrait être la cause?

Modifier

J'ai manqué quelques informations vitales ici, un autre dev a fait cela au fond du Application_Start()

ViewEngines.Engines.Add(new RazorViewEngine 
{ 
    PartialViewLocationFormats = new string[] 
    { 
      "~/Areas/Shared/{0}.cshtml", 
    } 
}); 
+0

Je ne peux pas reproduire ce problème sur MVC 5(); 'suivi par' ViewEngines.Engines.Add (new RazorViewEngine()); '. Veuillez montrer le code que vous utilisez pour répéter ceci. Notez que le moteur de vue interne 'MvcSiteMapProvider' est en attente de repli lorsque vous n'avez pas de modèle dans le dossier'/Views/Shared/DisplayTemplates'. – NightOwl888

+0

En outre, il peut être utile de voir le code HTML de sortie: les styles ne sont-ils pas affichés dans le code HTML ou la feuille de style est-elle endommagée? – NightOwl888

+0

fonctionne bien lorsque ViewEngines ne sont pas effacés, j'ai également vérifié le rendu html il semble ne pas utiliser le partiel lorsque les ViewEngines sont effacés car la structure html est différente de la partielle. pas de chance jusqu'à présent. – Ahsan

Répondre

0

Merci NightOwl et Rowan

La solution était d'ajouter "~/Views/Shared/{0}.cshtml" comme un élément en appelant `ViewEngines.Engines.Clear dans PartialViewLocationFormats

ViewEngines.Engines.Add(new RazorViewEngine 
      { 
       PartialViewLocationFormats = new string[] 
       { 
        "~/Areas/Shared/{0}.cshtml", 
        "~/Views/{1}/{0}.cshtml" 
        "~/Views/Shared/{0}.cshtml", 
       } 
      }); 
0

Lorsque le MvcSiteMapProvider est chargé, il utilise son propre ViewEngine. Je suppose que vous l'enlevez. Essayez d'ajouter un nouvel objet MvcSiteMapProvider.Web.Mvc.MvcSiteMapProviderViewEngine() à la liste des moteurs ViewEngines.

+0

Vous avez peut-être raison, mais MvcSiteMapProviderViewEngine() n'est pas disponible dans MvcSiteMapProvider.Web.Mvc. espace de nommage. – Ahsan

+0

Former le [code source] (https://github.com/maartenba/MvcSiteMapProvider/blob/master/src/MvcSiteMapProvider/MvcSiteMapProvider/Web/Mvc/MvcSiteMapProviderViewEngine.cs) c'est une classe interne, donc pas accessible –

+0

Dans ce cas , pouvez-vous simplement supprimer seulement les ViewEngines que vous ne voulez pas? Soit ça, ou réflexion? –

1

Je ne vois aucun problème avec les informations que vous avez fournies, mais je suppose que vous n'effacez pas et ne définissez pas les moteurs de vue à l'intérieur de la méthode Application_Start.

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     ViewEngines.Engines.Clear(); 
     ViewEngines.Engines.Add(new RazorViewEngine()); 

     AreaRegistration.RegisterAllAreas(); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 
} 

Notez que le moteur MvcSiteMapProvider interne pour la sauvegarde quand il n'y a pas de vues dans votre dossier /Views/Shared/DisplayTemplates/. Il servira le modèle par défaut à partir de la DLL dans ce cas, ce qui semble se passer ici.

Cela peut se produire si votre moteur de vue Razor est enregistré après le moteur de vue interne. Donc, si vous n'avez pas ce code dans Application_Start (comme vous le devriez), alors vous pouvez essayer d'insérer le moteur de vue Razor pour vous assurer qu'il est placé avant le moteur de secours MvcSiteMapProvider. Ou, comme déjà mentionné, il suffit de supprimer le moteur de visualisation de pages Web en une seule action.

ViewEngines.Engines.RemoveAt(0); 

Le moteur de vue interne est enregistré pour la première fois une aide MvcSiteMapProvider HTML est appelé. Donc, si vous appelez la méthode add après ce point, vous ajoutez le moteur de vue Razor après le moteur de vue interne MvcSiteMapProvider.

+0

Merci, j'ai trouvé le problème dans l'Application_Start() voir ma question éditée. – Ahsan

+0

Mais la question reste encore, je l'ai modifié le ViewEngines.Add à ViewEngines.Engines.Add (nouveau RazorViewEngine { PartialViewLocationFormats = new string [] { "~/zones/Shared/{0} .cshtml", "~/Shared/{0} .cshtml", "~/Vues/Shared/DisplayTemplates/{0} .cshtml" } }); – Ahsan