我有一些特定于每个剃刀视图的数据,并且我不想对每个视图进行硬编码。所以,我想在每个视图中添加与视图相关的编译时数据。
那么,有没有办法在asp.net应用程序的整个生命周期内同时将数据附加到每个视图?
注意 实际上我想静态地为每个视图添加webpack生成的脚本/样式。它们的链接包括哈希值,因此它们会在源脚本/样式发生变化所以,我只是想通过asp.net应用程序将它们添加到每个视图中一次(相当于在视图中键入它们),而不是每次加载一个视图。
答案 0 :(得分:2)
我创建了一个demo application for you here。
您需要使用appsettings.json文件,并将设置注入视图。
在我的appsettings.json中,我添加了一个名为" ViewConfiguration"的部分:
"ViewConfiguration": {
"ExampleKey": "ExampleValue"
}
您的各种值需要进入ViewConfiguration部分。
例如,如果我有ExampleKey
,您将使用类似" IndexPageStyleSheet"这样的通用名称,如果我有ExampleValue
,您将需要使用新版本更新每个版本样式表路径。这只需要在文件名更改时更新。
然后我创建了一个ViewConfiguration class,它存储了appsettings.json文件中的所有值。
您需要为每个配置行创建一个属性,并确保该属性的名称与appsettings.json中的键名相匹配。
例如,我的appsettings.json有ExampleKey
,我的ViewConfiguration类也有一个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中,我通过引用ViewConfiguration.ExampleKey
上的强类型属性来引用InjectedViewConfig.Value
属性,并输出&#34; ExampleValue&#34;在页面上。
这个值可以很容易地作为文件名注入到脚本或css链接标记中。它非常灵活。
<h1>Value: @InjectedViewConfig.Value.ExampleKey</h1>
通过进一步研究,您将能够从任何配置源(例如Azure应用程序设置或Azure Key Vault)注入这些值。有关详细信息,请参阅this article。
答案 1 :(得分:0)
如果您使用的是mvc,则可以创建模型并将其添加到视图中。由于您不想为每个视图重新创建,因此您可以创建只读变量。
static readonly MyModel ModelData = new MyModel { PropName = "Hello" };
public IActionResult Index () => View(ModelData);
在您的视图中,您现在可以强力键入值。如果您希望使用MVVM,可以参考ViewModel concept still exists in ASP.NET MVC Core?
答案 2 :(得分:-1)
实现IFileProvider和IFileInfo提供在编译时更改视图的内容。因此,我们可以使用模板引擎(即http://dotliquidmarkup.org/)替换和提供视图中的静态数据。