2015-02-10 7 views
0

Я использую те же файлы cshtml в разных проектах, поэтому я хотел бы иметь возможность использовать один и тот же каталог - «GeneralTemplates». Поэтому использование @Html.Partial("GeneralTemplates/_Header") работает как шарм. Но с @Html.MvcSiteMap().SiteMapPath("GeneralTemplates/_Breadcrumbs") это не работает, это должно быть в каталоге «DisplayTemplates», а затем это работает @Html.MvcSiteMap().SiteMapPath("_Breadcrumbs").Можно ли получить шаблон из другого каталога?

У кого-нибудь есть решение для меня, чтобы иметь файл в каталоге «GeneralTemplates»? Я думал, может быть, я могу получить список узлов для пути, но я не смог его найти.

ответ

0

Это скорее проблема MVC, чем MvcSiteMapProvider, так как MvcSiteMapProvider использует по умолчанию шаблонное поведение HTML-помощника.

Потребовался поиск, но я нашел способ переопределить это поведение путем добавления дополнительных путей в MVC места вида поиска по умолчанию: Can I Add to the Display/EditorTemplates Search Paths in ASP.NET MVC 3?

System.Web.Mvc.RazorViewEngine rve = (RazorViewEngine)ViewEngines.Engines 
    .Where(e=>e.GetType()==typeof(RazorViewEngine)) 
    .FirstOrDefault(); 

string[] additionalPartialViewLocations = new[] { 
    "~/Views/GeneralTemplates/{0}.cshtml" 
}; 

if(rve!=null) 
{ 
    rve.PartialViewLocationFormats = rve.PartialViewLocationFormats 
    .Union(additionalPartialViewLocations) 
    .ToArray(); 
} 

Я не считаю, что можно удалить /DisplayTemplates папка с пути, так как это соглашение (чтобы сохранить его отдельно от /EditorTemplates). Итак, самое лучшее, что вы сможете сделать, это сделать папку ~/Views/GeneralTemplates/DisplayTemplates/, используя приведенную выше конфигурацию.

Обратите внимание, что MVC проверяет папку /DisplayTemplates в том же каталоге, что и ваш вид, прежде чем перейти к /Views/Shared/DisplayTemplates, чтобы вы могли также перемещать их в один и тот же каталог представлений, где используются соответствующие HTML-хелперы.

Я не пробовал, но при указании шаблона также может быть использован полный путь просмотра (то есть ~/Views/GeneralTemplates/SiteMapPathHelperModel.cshtml).

@Html.MvcSiteMap().SiteMapPath("~/Views/GeneralTemplates/SiteMapPathHelperModel.cshtml") 

Важно: Если изменить расположение всех шаблонов, как это, вам, вероятно, нужно пройти через рекурсивные шаблоны и изменять все DisplayFor мест в них.

@model MvcSiteMapProvider.Web.Html.Models.SiteMapPathHelperModel 
@using System.Web.Mvc.Html 
@using System.Linq 
@using MvcSiteMapProvider.Web.Html.Models 

@foreach (var node in Model) { 
    @Html.DisplayFor(m => node); @* // <-- Need to add the diplaytemplate here, too *@ 

    if (node != Model.Last()) { 
     <text> &gt; </text> 
    } 
} 

Вы могли вместо создания пользовательской HTML-помощников, которые не являются шаблонным для решения этой проблемы, если другие решения не работают для вас.

+0

Thnx для вашего ответа! Я пробовал первый вариант, но он не сработал (мой GeneralTemplates находится в папке «Представления/Shared»). И использование полного пути тоже не сработало. Поэтому я собираюсь создать пользовательский HTML-помощник. –