覆盖 asp.net core razor 页面中的 razor 视图

Posted

技术标签:

【中文标题】覆盖 asp.net core razor 页面中的 razor 视图【英文标题】:Override razor views in asp.net core razor pages 【发布时间】:2018-02-24 02:30:48 【问题描述】:

在 asp.net core mvc 中,我为视图指定了多个位置。因此,如果某个位置缺少视图,则会从另一个位置获取视图。

我有一个带有 asp.net core mvc 的 CMS,其中控制器和视图位于已编译的库中。如果我不想使用库中的视图,可以轻松添加一个新视图,例如/Views/ControllerName/Index.cshtml 然后应用程序将使用此视图而不是从库中获取。

如何在剃须刀页面中完成?基本上,我希望通过在某个位置添加 .cshtml 文件来覆盖任何页面的剃刀视图。

【问题讨论】:

在配置 RazorViewEngineOptions options.PageViewLocationFormats.Add("/Themes/Bootstrap3/Views/Shared/0.cshtml"); 时尝试这样的事情; 【参考方案1】:

使用IViewLocationExpander,在默认位置之前添加您的自定义位置。

这是一个查看“覆盖”文件夹的示例:

public class MyViewLocationExpander : IViewLocationExpander

    public IEnumerable<string> ExpandViewLocations(
        ViewLocationExpanderContext context,
        IEnumerable<string> viewLocations)
    
        // 2 = Area
        // 1 = Controller
        // 0 = Action
        var locations = new string[]  "/Views/Override/2/1/0.cshtml" ;
        return locations.Union(viewLocations);
    

    public void PopulateValues(ViewLocationExpanderContext context)
    
    

然后在你的Startup 类中注册它:

public void ConfigureServices(IServiceCollection services)

    services.Configure<RazorViewEngineOptions>(options =>
    
        options.ViewLocationExpanders.Add(new MyViewLocationExpander());
    );

【讨论】:

它是否也适用于剃须刀页面。这似乎是一个 mvc 解决方案? 这个解决方案适用于 MVC Core 中的 Razor 页面,是的。【参考方案2】:

我没有使用此处建议的其他解决方案(IViewLocationExpander 或 PageViewLocationFormats)在 ASP.NET Core 2.2 中使用它。对我有用的是结合使用 PageRouteModelConvention 和 ActionConstraint。

这是一个用于本地化的类似解决方案:

PageRouteModelConvention and ActionConstraint Configuration in Startup

【讨论】:

以上是关于覆盖 asp.net core razor 页面中的 razor 视图的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core 上的 Razor 页面 - 添加了 Razor 页面但无法让页面显示

Asp.Net Core Razor 页面中的远程验证

Asp.net Core Razor 页面中的引导警报

更改 ASP.NET Core Razor 页面中的默认登录页面?

Asp.net core razor pages 加载部分页面

在 ASP.Net Core Razor 页面中添加 Toast