ASP.NET核心 - 在视图外部设置布局页面

时间:2017-12-21 15:49:03

标签: razor asp.net-core asp.net-core-mvc

我有一个ASP.NET Core 2.0应用程序,我正在尝试设置视图应该在视图外部使用的布局页面。这样我就不必在顶部为所有观点重复相同的代码。

我可以通过从以下基类继承我的所有视图来实现这一点,该基类在构造函数中设置它:

public class RazorPage<TModel> : Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel> {
    public RazorPage() {
        var theme = "Theme1;"
        Layout = $"~/Areas/{theme}/Views/Shared/_Layout" + RazorViewEngine.ViewExtension;
    }
}

这样可以正常工作,但主题名称会根据当前网址进行更改。我想我可以通过访问当前上下文来做到这一点,但是如果我在构造函数中调用Context属性,它将返回null。

没有合适的方法可以覆盖我可以设置Layout属性的位置,并且可以访问当前的请求上下文。

有没有人知道另一种做法?

请注意我知道我可以使用_ViewImports / _ViewStart文件实现这一点,但由于我的应用程序的结构,它需要我有重复的文件,而且我不喜欢在我的视图中有业务逻辑。

1 个答案:

答案 0 :(得分:1)

我使用IViewLocationExpander(由@ valery.sntx建议)指定在哪里查找我的主题的共享视图,该视图根据当前的URL进行更改。

然后我使用IFileProvider自动生成一个_ViewStart文件,并将其内容设置为:

@{
    Layout = "_Layout"; 
}

第二部分是可选的,但由于我的应用程序的设计方式,它使我不必创建多个_ViewStart文件。