是否可以从不同的目录中获取模板?

时间:2015-02-10 15:55:08

标签: c# asp.net-mvc mvcsitemapprovider

我在不同的项目中使用相同的cshtml文件,所以我希望能够共享同一个目录,即' GeneralTemplates'。所以使用@Html.Partial("GeneralTemplates/_Header")就像魅力一样。但由于@Html.MvcSiteMap().SiteMapPath("GeneralTemplates/_Breadcrumbs")不起作用,因此需要在' DisplayTemplates'目录,然后这工作@Html.MvcSiteMap().SiteMapPath("_Breadcrumbs")

有没有人能够让我能够将文件放在' GeneralTemplates'目录?我想也许我能够获得路径节点列表但我无法找到它。

1 个答案:

答案 0 :(得分: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/

请注意,在转到/DisplayTemplates之前,MVC会先检查与您的视图位于同一目录中的/Views/Shared/DisplayTemplates文件夹,因此您也可以将它们移动到相应的视图目录中。使用助手。

我还没试过,但在指定模板时也可以使用完整的视图路径(即~/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帮助程序以解决此问题。