在MVC中清除视图引擎会破坏站点地图的面包屑样式

时间:2015-08-27 00:13:04

标签: c# asp.net-mvc mvcsitemapprovider

在我正在开发的MVC 5 Web应用程序中,出于性能考虑,我正在使用RazorViewEngine清除视图引擎并在Global.asax.cs中仅添加ViewEngines.Engines.Clear();,并且它会破坏mvc sitemap breadcrumbs

之前

enter image description here

enter image description here

我的站点地图局部视图(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>

不知何故,它似​​乎又回落到另一个实现而不是视图下的部分&gt;分享&gt;显示模板

可能是什么原因?

修改

我在这里错过了一些重要的信息,另一个开发人员在Application_Start()

的底部做了这个
ViewEngines.Engines.Add(new RazorViewEngine
{
     PartialViewLocationFormats = new string[]
     {
           "~/Areas/Shared/{0}.cshtml",
     }
});

3 个答案:

答案 0 :(得分:1)

我没有看到您提供的信息存在问题,但我的猜测是您没有清除并在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);
    }
}

请注意,当MvcSiteMapProvider文件夹中没有视图时,内部/Views/Shared/DisplayTemplates/引擎用于备份。在这种情况下,它将从DLL中提供默认模板,这似乎是在这里发生的。

如果您的Razor视图引擎在内部视图引擎之后注册,则可能发生这种情况。因此,如果您在Application_Start(您应该)中没有此代码,那么您可以尝试插入Razor视图引擎以确保它位于MvcSiteMapProvider后备引擎之前。

ViewEngines.Engines.Clear();
ViewEngines.Engines.Insert(0, new RazorViewEngine());

或者如前所述,只需在一个操作中删除网页视图引擎。

ViewEngines.Engines.RemoveAt(0);

第一次调用MvcSiteMapProvider HTML帮助程序时,会注册内部视图引擎。因此,如果您在该点之后调用add方法,则在内部MvcSiteMapProvider视图引擎之后添加Razor视图引擎

答案 1 :(得分:0)

加载MvcSiteMapProvider时,它使用自己的ViewEngine。我怀疑你要删除它。

尝试将新的MvcSiteMapProvider.Web.Mvc.MvcSiteMapProviderViewEngine()对象添加到ViewEngines列表中。

答案 2 :(得分:0)

谢谢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",
                }
            });