RazorView/RazorPages 相关数据
RazorView/RazorPages related data
我有一些特定于每个 razor 视图的数据,我不想将它硬编码到每个视图。所以,我想为每个视图添加视图相关的编译时数据。
- 自定义属性对我不起作用,因为我们无法将自定义属性添加到 Razor 视图。
- 我不想 re-fetch/populate 每个请求或到达视图时从数据源(字典等)获取此数据。
那么,有没有什么方法可以在 asp.net 应用程序的整个生命周期中将数据一次附加到每个视图?
备注
实际上我想为每个视图静态添加 webpack 生成的 scripts/styles 。他们的链接包含哈希值,因此当源 scripts/styles 更改时它们会更改。所以,我只想通过 asp.net 应用程序将它们添加到每个视图一次(相当于将它们输入视图),而不是每次加载视图时。
如果您使用的是 mvc,则可以创建模型并将其添加到视图中。由于您不想为每个视图重新创建,您可以创建只读变量。
static readonly MyModel ModelData = new MyModel { PropName = "Hello" };
public IActionResult Index () => View(ModelData);
在您看来,您现在可以强键入值。如果你想使用MVVM,你可以参考
我创建了一个demo application for you here。
您需要使用您的 appsettings.json 文件,并将您的设置注入您的视图。
在我的 appsettings.json 中,我添加了一个名为 "ViewConfiguration" 的部分:
"ViewConfiguration": {
"ExampleKey": "ExampleValue"
}
您的各种值需要进入您的 ViewConfiguration 部分。
例如,在我有 ExampleKey
的地方,您将使用像 "IndexPageStyleSheet" 这样的通用名称,而在我有 ExampleValue
的地方,您需要使用新样式表更新每个版本小路。仅当文件名更改时才需要更新。
然后我创建了一个 ViewConfiguration class 来存储 appsettings.json 文件中的所有值。
您需要为每个配置行创建一个 属性,并确保 属性 的名称与您的 appsettings.json.[=32= 中的密钥名称相匹配]
例如,我的 appsettings.json 有 ExampleKey
,我的 ViewConfiguration class 也有一个 ExampleKey
.
public class ViewConfiguration {
public string ExampleKey { get; set; }
}
在您的 Startup.cs 中,您需要告诉您的 IOC 容器将您的配置值加载到您的配置对象中。
在 my Startup.cs 中,我的 ConfigureServices
方法自动将我的 "ExampleValue" 加载到 ViewConfiguration.ExampleKey。
public void ConfigureServices(IServiceCollection services) {
// This line is the magic that loads the values from appsettings.json into a ViewConfiguration object.
services.Configure<ViewConfiguration>(Configuration.GetSection("ViewConfiguration"));
services.AddMvc();
}
现在,在我的 _ViewImports.cshtml 中,我注入了我的 ViewConfiguration 对象,这样我就不需要将它注入到每个页面中。这可以在 _ViewImports.cshtml
文件中的任何位置。如果只想为每个文件夹注入特定配置,则可以为每个文件夹创建一个新的 _ViewImports.cshtml 文件,然后将不同的配置对象注入每个文件夹。很灵活。
@using Microsoft.Extensions.Options;
@* Please rename this variable to something more appropriate to your application: *@
@inject IOptions<ViewConfiguration> InjectedViewConfig
现在,在任何页面中,您只需在 ViewConfiguration
对象中引用 属性。
例如在 my Index.cshtml 中,我通过引用 InjectedViewConfig.Value
上的强类型 属性 来引用 ViewConfiguration.ExampleKey
属性,它输出 "ExampleValue"在页面上。
这个值可以像文件名一样容易地注入到脚本或 css link 标记中。非常灵活。
<h1>Value: @InjectedViewConfig.Value.ExampleKey</h1>
通过进一步研究,您将能够从任何配置源注入这些值,例如 Azure 应用程序设置或 Azure Key Vault。请参阅 this article 了解更多详情。
实现 IFileProvider 和 IFileInfo 可以在编译时更改视图的内容。因此,我们可以使用模板引擎(即 http://dotliquidmarkup.org/)在视图中替换和提供静态数据。
我有一些特定于每个 razor 视图的数据,我不想将它硬编码到每个视图。所以,我想为每个视图添加视图相关的编译时数据。
- 自定义属性对我不起作用,因为我们无法将自定义属性添加到 Razor 视图。
- 我不想 re-fetch/populate 每个请求或到达视图时从数据源(字典等)获取此数据。
那么,有没有什么方法可以在 asp.net 应用程序的整个生命周期中将数据一次附加到每个视图?
备注 实际上我想为每个视图静态添加 webpack 生成的 scripts/styles 。他们的链接包含哈希值,因此当源 scripts/styles 更改时它们会更改。所以,我只想通过 asp.net 应用程序将它们添加到每个视图一次(相当于将它们输入视图),而不是每次加载视图时。
如果您使用的是 mvc,则可以创建模型并将其添加到视图中。由于您不想为每个视图重新创建,您可以创建只读变量。
static readonly MyModel ModelData = new MyModel { PropName = "Hello" };
public IActionResult Index () => View(ModelData);
在您看来,您现在可以强键入值。如果你想使用MVVM,你可以参考
我创建了一个demo application for you here。
您需要使用您的 appsettings.json 文件,并将您的设置注入您的视图。
在我的 appsettings.json 中,我添加了一个名为 "ViewConfiguration" 的部分:
"ViewConfiguration": {
"ExampleKey": "ExampleValue"
}
您的各种值需要进入您的 ViewConfiguration 部分。
例如,在我有 ExampleKey
的地方,您将使用像 "IndexPageStyleSheet" 这样的通用名称,而在我有 ExampleValue
的地方,您需要使用新样式表更新每个版本小路。仅当文件名更改时才需要更新。
然后我创建了一个 ViewConfiguration class 来存储 appsettings.json 文件中的所有值。
您需要为每个配置行创建一个 属性,并确保 属性 的名称与您的 appsettings.json.[=32= 中的密钥名称相匹配]
例如,我的 appsettings.json 有 ExampleKey
,我的 ViewConfiguration class 也有一个 ExampleKey
.
public class ViewConfiguration {
public string ExampleKey { get; set; }
}
在您的 Startup.cs 中,您需要告诉您的 IOC 容器将您的配置值加载到您的配置对象中。
在 my Startup.cs 中,我的 ConfigureServices
方法自动将我的 "ExampleValue" 加载到 ViewConfiguration.ExampleKey。
public void ConfigureServices(IServiceCollection services) {
// This line is the magic that loads the values from appsettings.json into a ViewConfiguration object.
services.Configure<ViewConfiguration>(Configuration.GetSection("ViewConfiguration"));
services.AddMvc();
}
现在,在我的 _ViewImports.cshtml 中,我注入了我的 ViewConfiguration 对象,这样我就不需要将它注入到每个页面中。这可以在 _ViewImports.cshtml
文件中的任何位置。如果只想为每个文件夹注入特定配置,则可以为每个文件夹创建一个新的 _ViewImports.cshtml 文件,然后将不同的配置对象注入每个文件夹。很灵活。
@using Microsoft.Extensions.Options;
@* Please rename this variable to something more appropriate to your application: *@
@inject IOptions<ViewConfiguration> InjectedViewConfig
现在,在任何页面中,您只需在 ViewConfiguration
对象中引用 属性。
例如在 my Index.cshtml 中,我通过引用 InjectedViewConfig.Value
上的强类型 属性 来引用 ViewConfiguration.ExampleKey
属性,它输出 "ExampleValue"在页面上。
这个值可以像文件名一样容易地注入到脚本或 css link 标记中。非常灵活。
<h1>Value: @InjectedViewConfig.Value.ExampleKey</h1>
通过进一步研究,您将能够从任何配置源注入这些值,例如 Azure 应用程序设置或 Azure Key Vault。请参阅 this article 了解更多详情。
实现 IFileProvider 和 IFileInfo 可以在编译时更改视图的内容。因此,我们可以使用模板引擎(即 http://dotliquidmarkup.org/)在视图中替换和提供静态数据。