【问题标题】:RazorView/RazorPages related dataRazor View/Razor Pages 相关数据
【发布时间】:2018-06-29 11:23:09
【问题描述】:

我有一些特定于每个剃须刀视图的数据,并且我不想将其硬编码到每个视图。所以,我想为每个视图添加视图相关的编译时数据。

  • 自定义属性对我不起作用,因为我们无法将自定义属性添加到剃刀视图。
  • 我不想为每个请求或到达视图时从数据源(字典等)重新获取/填充此数据。

那么,有没有办法在 asp.net 应用程序的整个生命周期中一次将数据附加到每个视图?

注意 实际上,我想为每个视图静态添加 webpack 生成的脚本/样式。它们的链接包含哈希值,因此当源脚本/样式更改时它们会更改。所以,我只想通过 asp.net 应用程序将它们添加到每个视图一次(相当于将它们输入视图),而不是每次加载视图时。

【问题讨论】:

  • 你为什么使用剃须刀页面?这听起来真的像 mvc 的工作
  • Razor 页面或视图,没关系。
  • 我不确定你想要什么。您想显示与 OnGet 方法不同的视图,还是想根据使用自定义路由通过 URL 传递的数据显示不同的剃须刀页面?
  • 实际上我想为每个视图静态添加 webpack 生成的脚本/样式。它们的链接包含哈希值,因此当源脚本/样式更改时它们会更改。因此,我只想通过 asp.net 应用程序将它们添加到每个视图一次(相当于将它们输入视图),而不是每次加载视图时。
  • 为什么不将硬编码链接添加到布局页面或部分视图?如果它们每次在编译时都发生变化,则必须按照 Neville Nazerane 的回答将它们作为模型中的静态属性。

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


【解决方案1】:

如果您使用 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】:

    我创建了一个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中,我通过引用InjectedViewConfig.Value上的强类型属性来引用ViewConfiguration.ExampleKey属性,并在页面上输出“ExampleValue”。

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

    <h1>Value: @InjectedViewConfig.Value.ExampleKey</h1>
    

    通过进一步研究,您将能够从任何配置源注入这些值,例如 Azure 应用程序设置或 Azure Key Vault。详情请见this article。

    【讨论】:

    • 感谢您的努力,但我不想为每个视图使用神奇的属性名称,我想要与路径关联的值,因此我不想在每个视图中键入路径,而只是访问这些属性。除此之外,我希望将它们静态编译到视图中,而不是在每次访问视图时从类或字典中获取,而是在应用程序的整个生命周期中每个视图只获取一次。但除了一些模板引擎或编译覆盖之外,这似乎几乎是不可能的。
    • @lockedscope 不幸的是,剃刀页面不打算这样实现。 MVC 是配置框架的约定,您尝试的不是传统的。您是对的,如果您不能使用常规方法,那么研究另一个视图引擎肯定会更好。
    • 但是配置视图可能很好。随着编译的进步,我们应该很容易篡改视图的编译。
    • @lockedscope 好吧,在这种情况下,我认为传统的方法是使用 bundleconfig.json 并使用内置的捆绑引擎而不是 webpack。请参阅this article 了解有关 bundleconfig.json 的更多信息
    • 这很好,但我认为它不支持像 webpack 这样的广泛选项/插件。
    【解决方案3】:

    实现 IFileProvider 和 IFileInfo 可以在编译时更改视图的内容。因此,我们可以使用模板引擎替换并提供视图中的静态数据(即http://dotliquidmarkup.org/)。

    检查这个; https://www.mikesdotnetting.com/article/301/loading-asp-net-core-mvc-views-from-a-database-or-other-location

    【讨论】:

      猜你喜欢
      • 2021-06-19
      • 1970-01-01
      • 2021-11-21
      • 2018-10-29
      • 2021-12-30
      • 2018-12-05
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多