是否可以从不同目录获取模板?
Is it possible to get template from different directory?
我在不同的项目中使用相同的 cshtml 文件,因此我希望能够共享相同的目录 'GeneralTemplates'。所以使用 @Html.Partial("GeneralTemplates/_Header")
就像一个魅力。但是 @Html.MvcSiteMap().SiteMapPath("GeneralTemplates/_Breadcrumbs")
是行不通的,这需要在 'DisplayTemplates' 目录中,然后才有效 @Html.MvcSiteMap().SiteMapPath("_Breadcrumbs")
.
有没有人能为我提供解决方案,使我能够在 'GeneralTemplates' 目录中找到该文件?我在想也许我能够获得路径的节点列表,但我找不到它。
这比 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/
。
请注意,在转到 /Views/Shared/DisplayTemplates
之前,MVC 首先会检查与您的视图位于同一目录中的 /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> > </text>
}
}
如果其他解决方案不适合您,您 可以 构建非模板化的自定义 HTML 助手来解决此问题。
我在不同的项目中使用相同的 cshtml 文件,因此我希望能够共享相同的目录 'GeneralTemplates'。所以使用 @Html.Partial("GeneralTemplates/_Header")
就像一个魅力。但是 @Html.MvcSiteMap().SiteMapPath("GeneralTemplates/_Breadcrumbs")
是行不通的,这需要在 'DisplayTemplates' 目录中,然后才有效 @Html.MvcSiteMap().SiteMapPath("_Breadcrumbs")
.
有没有人能为我提供解决方案,使我能够在 'GeneralTemplates' 目录中找到该文件?我在想也许我能够获得路径的节点列表,但我找不到它。
这比 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/
。
请注意,在转到 /Views/Shared/DisplayTemplates
之前,MVC 首先会检查与您的视图位于同一目录中的 /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> > </text>
}
}
如果其他解决方案不适合您,您 可以 构建非模板化的自定义 HTML 助手来解决此问题。