RazorView/RazorPages相关数据

RazorView/RazorPages相关数据,razor,asp.net-core,asp.net-core-2.0,razor-pages,Razor,Asp.net Core,Asp.net Core 2.0,Razor Pages,我有一些特定于每个razor视图的数据,我不想将其硬编码到每个视图。因此,我想向每个视图添加与视图相关的编译时数据 自定义属性不适用于我,因为我们无法向razor视图添加自定义属性。 对于每个请求或访问视图时,我不想从data sourcedictionary等重新获取/填充此数据。 那么,在asp.net应用程序的整个生命周期中,是否有任何方法可以将数据一次附加到每个视图 注 实际上,我想静态地为每个视图添加由webpack生成的脚本/样式。它们的链接包含散列值,因此在源脚本/样式更改时它们会

我有一些特定于每个razor视图的数据,我不想将其硬编码到每个视图。因此,我想向每个视图添加与视图相关的编译时数据

自定义属性不适用于我,因为我们无法向razor视图添加自定义属性。 对于每个请求或访问视图时,我不想从data sourcedictionary等重新获取/填充此数据。 那么,在asp.net应用程序的整个生命周期中,是否有任何方法可以将数据一次附加到每个视图


实际上,我想静态地为每个视图添加由webpack生成的脚本/样式。它们的链接包含散列值,因此在源脚本/样式更改时它们会更改。因此,我只想让它们在每个视图中添加一次,相当于在asp.net应用程序中将它们输入到视图中,而不是每次加载视图时。

如果您使用的是mvc,则可以创建模型并将其添加到视图中。由于不希望为每个视图重新创建,因此可以创建只读变量

static readonly MyModel ModelData = new MyModel { PropName = "Hello" };
public IActionResult Index () => View(ModelData);
在您的视图中,现在可以强键入值。如果您希望使用MVVM,可以参考我创建的

您需要使用appsettings.json文件,并将设置注入视图

在我的中,我添加了一个名为ViewConfiguration的部分:

"ViewConfiguration": {
    "ExampleKey": "ExampleValue"
}
您的各种值需要进入ViewConfiguration部分

例如,在我有ExampleKey的地方,您将使用像IndexPageStyleSheet这样的通用名称;在我有ExampleValue的地方,您将需要使用新的样式表路径更新每个版本。这只需要在文件名更改时更新

然后,我创建了一个存储appsettings.json文件中所有值的数据库

您需要为每个配置行创建一个属性,并确保该属性的名称与appsettings.json中的键的名称匹配

例如,当my appsettings.json有ExampleKey时,我的ViewConfiguration类也有ExampleKey

在Startup.cs中,您需要告诉IOC容器将配置值加载到配置对象中

在中,我的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();
    }
现在,在任何页面中,您都可以简单地引用ViewConfiguration对象中的属性

例如,在中,我通过引用InjectedViewConfig.Value上的强类型属性来引用ViewConfiguration.ExampleKey属性,它在页面上输出ExampleValue

这个值可以像文件名一样轻松地注入到脚本或css链接标记中。它非常灵活

@using Microsoft.Extensions.Options;

@* Please rename this variable to something more appropriate to your application: *@
@inject IOptions<ViewConfiguration> InjectedViewConfig
<h1>Value: @InjectedViewConfig.Value.ExampleKey</h1>

通过进一步研究,您将能够从任何配置源(如Azure应用程序设置或Azure密钥库)注入这些值。有关更多详细信息,请参阅。

实现IFileProvider和IFileInfo可在编译时更改视图内容。因此,我们可以用模板引擎替换并提供视图中的静态数据

检查这个;

为什么要使用剃须刀页面?这听起来真的像是MVC的工作,或者页面或视图,这并不重要。我不确定你想要什么。您想显示不同于OnGet方法的视图,还是想根据使用自定义路由通过URL传递的数据显示不同的razor页面?实际上,我想静态添加webpack为每个视图生成的脚本/样式。它们的链接包含散列值,因此在源脚本/样式更改时它们会更改。所以,我只想让它们添加到每个视图中一次,就相当于通过asp.net应用程序将它们输入到视图中,而不是每次加载视图时。为什么不将硬编码链接添加到布局页面或部分视图?如果它们每次在编译时都会更改,那么根据Neville Nazerane的回答,您必须将它们作为静态属性放在模型中。我很感激您的努力,但我不想为每个视图使用神奇的属性名称,我想要与路径关联的值,因此我不想在每个视图中键入路径,而只是访问这些属性。除此之外,我希望将它们静态编译到视图中,而不是每次访问视图时都从类或字典中获取,而是在应用程序的整个生命周期中每个视图只获取一次。但除了一些模板引擎或编译覆盖之外,这几乎是不可能的。@lockedscope不幸的是,razor页面不打算这样实现。MVC是一种超越配置框架的约定,您尝试的并不是传统的。您是对的,如果您不能使用传统的方法,那么最好使用另一个视图引擎。但是配置视图可能会很好。随着当今编译的发展,我们应该很容易篡改视图的编译。@lockedscope在这种情况下,我认为传统的方法是使用bundleconfig.json并使用内置的捆绑引擎,而不是webpack。有关捆绑包的更多信息,请参阅
json这很好,但我认为它不支持像webpack这样广泛的选项/插件。
<h1>Value: @InjectedViewConfig.Value.ExampleKey</h1>