在 MVC 中清除视图引擎会破坏站点地图面包屑样式
Clearing View Engines in MVC breaks sitemap breadcrumb styles
在我正在开发的 MVC 5 Web 应用程序中,为了性能起见,我正在清除视图引擎并使用 ViewEngines.Engines.Clear();
在 Global.asax.cs
中仅添加 RazorViewEngine
并且它破坏了mvc 站点地图面包屑中的样式
之前
之后
我的站点地图部分视图 (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>
它似乎以某种方式回退到另一种实现,而不是视图 > 共享 > 显示模板下的部分
可能是什么原因?
编辑
我在这里遗漏了一些重要信息,另一位开发人员在 Application_Start()
的底部完成了此操作
ViewEngines.Engines.Add(new RazorViewEngine
{
PartialViewLocationFormats = new string[]
{
"~/Areas/Shared/{0}.cshtml",
}
});
加载 MvcSiteMapProvider
时,它使用自己的 ViewEngine。我怀疑你正在删除它。
尝试将新的 MvcSiteMapProvider.Web.Mvc.MvcSiteMapProviderViewEngine()
对象添加到 ViewEngines 列表。
我没有发现你提供的信息有问题,但我猜你没有在 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);
}
}
请注意,当您的 /Views/Shared/DisplayTemplates/
文件夹中没有视图时,内部 MvcSiteMapProvider
引擎用于备份。在这种情况下,它将从 DLL 中提供默认模板,这似乎是这里发生的事情。
如果您的 Razor 视图引擎是在内部视图引擎之后注册的,则可能会发生这种情况。因此,如果您在 Application_Start
中没有此代码(您应该这样做),那么您可以尝试插入 Razor 视图引擎以确保它位于 MvcSiteMapProvider
回退引擎之前。
ViewEngines.Engines.Clear();
ViewEngines.Engines.Insert(0, new RazorViewEngine());
或者如前所述,只需一次删除网页查看引擎。
ViewEngines.Engines.RemoveAt(0);
内部视图引擎在第一次调用 MvcSiteMapProvider
HTML 助手时注册。因此,如果您在那之后调用 add 方法,那么您将在 之后 添加 Razor 视图引擎 MvcSiteMapProvider
内部视图引擎。
感谢 NightOwl 和 Rowan
解决方案是将 "~/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",
}
});
在我正在开发的 MVC 5 Web 应用程序中,为了性能起见,我正在清除视图引擎并使用 ViewEngines.Engines.Clear();
在 Global.asax.cs
中仅添加 RazorViewEngine
并且它破坏了mvc 站点地图面包屑中的样式
之前
之后
我的站点地图部分视图 (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>
它似乎以某种方式回退到另一种实现,而不是视图 > 共享 > 显示模板下的部分
可能是什么原因?
编辑
我在这里遗漏了一些重要信息,另一位开发人员在 Application_Start()
的底部完成了此操作ViewEngines.Engines.Add(new RazorViewEngine
{
PartialViewLocationFormats = new string[]
{
"~/Areas/Shared/{0}.cshtml",
}
});
加载 MvcSiteMapProvider
时,它使用自己的 ViewEngine。我怀疑你正在删除它。
尝试将新的 MvcSiteMapProvider.Web.Mvc.MvcSiteMapProviderViewEngine()
对象添加到 ViewEngines 列表。
我没有发现你提供的信息有问题,但我猜你没有在 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);
}
}
请注意,当您的 /Views/Shared/DisplayTemplates/
文件夹中没有视图时,内部 MvcSiteMapProvider
引擎用于备份。在这种情况下,它将从 DLL 中提供默认模板,这似乎是这里发生的事情。
如果您的 Razor 视图引擎是在内部视图引擎之后注册的,则可能会发生这种情况。因此,如果您在 Application_Start
中没有此代码(您应该这样做),那么您可以尝试插入 Razor 视图引擎以确保它位于 MvcSiteMapProvider
回退引擎之前。
ViewEngines.Engines.Clear();
ViewEngines.Engines.Insert(0, new RazorViewEngine());
或者如前所述,只需一次删除网页查看引擎。
ViewEngines.Engines.RemoveAt(0);
内部视图引擎在第一次调用 MvcSiteMapProvider
HTML 助手时注册。因此,如果您在那之后调用 add 方法,那么您将在 之后 添加 Razor 视图引擎 MvcSiteMapProvider
内部视图引擎。
感谢 NightOwl 和 Rowan
解决方案是将 "~/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",
}
});