2015-08-27 9 views
4

В веб-приложении MVC 5, которое я разрабатываю, для повышения эффективности я очищаю механизмы просмотра и добавляю только RazorViewEngine в Global.asax.cs, используя ViewEngines.Engines.Clear();, и он разбивает стили в карте сайта mvc сухариClearing View Двигатели в MVC разрывают стили sitemap breadcrumb

Перед

enter image description here

После

enter image description here

Моей карта сайт частичного вид (SiteMapPathHelperModel.cshtml) выглядит

@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> 

Как-то, кажется, падает обратно в другую реализацию, чем частичные соображения> общие> шаблонов отображения

В чем может быть причина?

Редактировать

я пропустил некоторые жизненно информацию здесь, еще DEV сделал это в нижней части Application_Start()

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

Я не могу воспроизвести этот вопрос на MVC 5 при вызове 'ViewEngines.Engines.Clear(); ', за которым следует' ViewEngines.Engines.Add (новый RazorViewEngine()); '. Пожалуйста, покажите код, который вы используете, чтобы повторить это. Обратите внимание, что внутренний механизм просмотра 'MvcSiteMapProvider' предназначен для резервного копирования, когда у вас нет шаблона в папке'/Views/Shared/DisplayTemplates'. – NightOwl888

+0

Кроме того, было бы полезно увидеть выходной HTML - это стили, которые не выводятся в HTML, или это стили разбиты? – NightOwl888

+0

отлично работает, когда ViewEngines не очищаются, я также проверил визуализированный html, который, как представляется, не использует частичное, когда ViewEngines очищаются, поскольку структура html отличается от частичной. пока не повезло. – Ahsan

ответ

0

Благодаря Nightowl и Роуэн

Решение было добавить "~/Views/Shared/{0}.cshtml" в качестве элемента в PartialViewLocationFormats

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

Когда MvcSiteMapProvider загружен, он использует свой собственный ViewEngine. Я подозреваю, что вы его удаляете.

Попробуйте добавить новый объект MvcSiteMapProvider.Web.Mvc.MvcSiteMapProviderViewEngine() к списку ViewEngines.

+0

Возможно, вы правы, но MvcSiteMapProviderViewEngine() недоступен в MvcSiteMapProvider.Web.Mvc. Пространство имен. – Ahsan

+0

Создайте [исходный код] (https://github.com/maartenba/MvcSiteMapProvider/blob/master/src/MvcSiteMapProvider/MvcSiteMapProvider/Web/Mvc/MvcSiteMapProviderViewEngine.cs) его внутренний класс, поэтому он недоступен –

+0

В этом случае , можете ли вы просто удалить только те объекты ViewEngines, которые вы не хотите? Либо это, либо отражение? –

1

Я не вижу проблемы с предоставленной вами информацией, но я предполагаю, что вы не очищаете и не устанавливаете механизмы просмотра внутри метода 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); 
    } 
} 

Обратите внимание, что внутренний MvcSiteMapProvider двигатель для резервного копирования, когда нет мнения в вашей папке /Views/Shared/DisplayTemplates/. В этом случае он будет использовать шаблон по умолчанию из DLL, что, как представляется, происходит здесь.

Это может произойти, если двигатель просмотра Razor зарегистрирован после внутреннего механизма просмотра. Итак, если у вас нет этого кода в Application_Start (как и должно быть), вы можете попытаться вставить механизм просмотра Razor, чтобы убедиться, что он помещен перед резервным двигателем MvcSiteMapProvider.

ViewEngines.Engines.Clear(); 
ViewEngines.Engines.Insert(0, new RazorViewEngine()); 

Как уже упоминалось, просто удалите движок просмотра веб-страницы за одно действие.

ViewEngines.Engines.RemoveAt(0); 

Внутренний вид двигателя зарегистрирован в первый раз MvcSiteMapProvider HTML Хелпер называется. Поэтому, если вы вызываете метод добавления после этой точки, вы добавляете движок просмотра Razor после внутренний движок просмотра MvcSiteMapProvider.

+0

Спасибо, я нашел проблему в Application_Start(), чтобы увидеть мой отредактированный вопрос. – Ahsan

+0

Но проблема все еще остается, я модифицировал ViewEngines.Add к ViewEngines.Engines.Add (новый RazorViewEngine { PartialViewLocationFormats = новая строка [] { "~/Районы/Shared/{0} .cshtml", "~/Shared/{0} .cshtml", "~/Views/Shared/DisplayTemplates/{0} .cshtml" } }); – Ahsan