代码之家  ›  专栏  ›  技术社区  ›  Giedo Donkers

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

  •  0
  • Giedo Donkers  · 技术社区  · 10 年前

    我在不同的项目中使用相同的cshtml文件,因此我希望能够共享相同的目录,即“GeneralTemplates”。因此,使用 @Html.Partial("GeneralTemplates/_Header") 就像一个魅力。但随着 @Html.MvcSiteMap().SiteMapPath("GeneralTemplates/_Breadcrumbs") 它不起作用,它需要在“DisplayTemplates”目录中,然后才能起作用 @Html.MvcSiteMap().SiteMapPath("_Breadcrumbs") .

    有没有人能为我提供一个解决方案,让我能够将文件保存在“GeneralTemplates”目录中?我在想也许我能得到路径的节点列表,但我找不到。

    1 回复  |  直到 10 年前
        1
  •  0
  •   Community CDub    7 年前

    与MvcSiteMapProvider相比,这更像是一个MVC问题,因为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检查 /显示模板 在转到 /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帮助程序来解决此问题。