如何将配置设置添加到 _Layout.cshtml 共享 Razor 页面
How to add configuration settings into _Layout.cshtml shared Razor page
我们有这个 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
尝试将此 Version 注入此共享页面,因此我无法执行代码隐藏方法。那怎么注入呢?
更新 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;
}
}
您可以使用 _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";
}
希望这对您有所帮助:)
就像在 Controller 中一样,您也可以将您的服务注入到视图中。
您可以这样使用 @inject
:
@inject Microsoft.Extensions.Options.IOptions<AppSettings> AppSettingsOptions
或将 @using Microsoft.Extensions.Options
添加到 _ViewImports.cs,然后像这样在布局中注入选项:
@inject IOptions<AppSettings> AppSettingsOptions
.
之后您可以访问您的设置,例如:@AppSettingsOptions.Value.Version
。
添加到 Hameed 的答案中,对于 Core 3.1:
AppSettings.Json:
{ "Company": {"Name": "EvilCorp"}}
_ViewImports.cshtml:
@using Microsoft.Extensions.Configuration
_Layout.cshtml:
@inject IConfiguration _config
在剃刀 html 中:
<h1>@_config["Company:Name"]</h1>
我们有这个 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
尝试将此 Version 注入此共享页面,因此我无法执行代码隐藏方法。那怎么注入呢?
更新 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;
}
}
您可以使用 _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";
}
希望这对您有所帮助:)
就像在 Controller 中一样,您也可以将您的服务注入到视图中。
您可以这样使用 @inject
:
@inject Microsoft.Extensions.Options.IOptions<AppSettings> AppSettingsOptions
或将 @using Microsoft.Extensions.Options
添加到 _ViewImports.cs,然后像这样在布局中注入选项:
@inject IOptions<AppSettings> AppSettingsOptions
.
之后您可以访问您的设置,例如:@AppSettingsOptions.Value.Version
。
添加到 Hameed 的答案中,对于 Core 3.1:
AppSettings.Json:
{ "Company": {"Name": "EvilCorp"}}
_ViewImports.cshtml:
@using Microsoft.Extensions.Configuration
_Layout.cshtml:
@inject IConfiguration _config
在剃刀 html 中:
<h1>@_config["Company:Name"]</h1>