如何将配置设置添加到_Layout.cshtml共享Razor页面中

时间:2019-01-26 06:04:24

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

我们有这个StartUp如下,从appsettings.json获取值:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    Configuration = builder.Build();

    var environment = Configuration["ApplicationSettings:Environment"];
}

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<AppSettings>(Configuration.GetSection("ApplicationSettings"));

    ...
}

我们也将模型称为AppSettings

public class AppSettings
{
    public string Environment { get; set; }
    public string Version { get; set; }
}

在我尝试/Pages/Shared/_Layout.cshtml并将此版本注入此共享页面时,我无法执行方法背后的代码。那么如何注入呢?

更新1-

理论上,如果它是页面模型,我可以这样做:

public class _LayoutModel : PageModel
{
    private readonly AppSettings _appSettings;

    public string Version;
    public string Environment;

    public _LayoutModel(IOptions<AppSettings> appsettings)
    {
        _appSettings = appsettings.Value;
    }

    public void OnGet()
    {
        Environment = _appSettings.Environment;
        Version = _appSettings.Version;
    }
}

3 个答案:

答案 0 :(得分:2)

您可以使用_layout.cshtml文件中的ViewData访问设置。

在_layout.cshtml文件中

<title>Version : @ViewData["Version"] | Environment : @ViewData["Environment"]</title>

但是您必须像这样共享此布局的所有页面的.cshtml文件中设置ViewData的值

@model YourPageModel
@{
    ViewData["Environment"] = Model.Environment;
    ViewData["Version"] = Model.Version;
    Layout = "/Pages/Shared/_Layout.cshtml";
}

希望这会有所帮助:)

答案 1 :(得分:2)

就像在Controller中一样,您也可以将服务注入视图。

您可以像这样使用@inject

@inject Microsoft.Extensions.Options.IOptions<AppSettings> AppSettingsOptions

或将@using Microsoft.Extensions.Options添加到_ViewImports.cs,然后按以下方式在您的布局中插入选项:

@inject IOptions<AppSettings> AppSettingsOptions

之后,您可以访问诸如@AppSettingsOptions.Value.Version之类的设置。

答案 2 :(得分:1)

为核心3.1添加了Hameed的答案:

AppSettings.Json: @MockBean RequestInterceptor interceptor; // I NEED THIS @BeforeEach public void initTest() throws Exception { Mockito.when(interceptor.preHandle(any(), any(), any())).thenReturn(true); // AND THIS }

_ViewImports.cshtml: { "Company": {"Name": "EvilCorp"}}

_Layout.cshtml: @using Microsoft.Extensions.Configuration

在Razor html中: @inject IConfiguration _config