如何在剃刀页面 C# 代码块中注入 appsettings.json 配置?

Posted

技术标签:

【中文标题】如何在剃刀页面 C# 代码块中注入 appsettings.json 配置?【英文标题】:How do you inject your appsettings.json configuration in a razor page C# code block? 【发布时间】:2022-01-15 01:06:50 【问题描述】:

我正在关注以下官方文档:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-6.0#access-configuration-in-razor-pages

@Configuration["myKey"] 的这种实现非常适用于不在 @ 括号之间的代码,但是当我有一个代码块时,它根本不起作用。

据我所知,该文档没有提供任何代码示例...

我该如何解决这个问题?

代码当然在 Razor 页面 (.cshtml) 中。

我尝试删除@ 并在没有@ 的情况下放入相同的代码,但随后它给出了上下文错误...

附:如果重要的话,有问题的代码是 POCO。

P.P.S.我使用@inject IConfiguration Configuration 来导入 Razor 页面顶部的配置。

我有问题的代码:

var website = new WebSite()
        
    private string altName = Configuration["FrameworkData:PageTitle"] +" - " +Configuration["FrameworkData:Slogan"];
    AlternateName = altName,
....

我已经尝试在配置规范之前指定 IConfiguration 类型,但无济于事。

更新

我的起始代码中包含有问题的部分:

@using Microsoft.AspNetCore.Http;
@using Schema.NET;
@model projectname2.Areas.MyFeature.Pages.Shared._LayoutModel
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
@  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name='description' content='@ViewData["Description"]'>
    <title>@ViewData["Title"] - @Configuration["FrameworkData:PageTitle"]</title>
    @
        var website = new WebSite()
        
            private string altName = "";
    string altName = $"Configuration["FrameworkData:PageTitle"] - Configuration["FrameworkData:Slogan"]";
    AlternateName = altName,
    Name = Configuration["FrameworkData:PageTitle"],
    Url = new Uri("https://example.com")
;
        var jsonLd = website.ToString();
        var address = new PostalAddress()
        
        StreetAddress = "Example street 10",
        AddressLocality = "NY",
        PostalCode = "11111",
        AddressCountry = "US"
        ;
        var geo = new GeoCoordinates()
        
            Latitude = 0.3947623,
            Longitude = 0.8723408
        ;
        var localbusiness = new LocalBusiness()
            
                Name = "Project name",
                Image = new Uri("https://example.com/graphics/logo.svg"),
                Url = new Uri("https://example.com"),
                Telephone = "1234 1243567",
                Address = address,
                Geo = geo,
                SameAs = new Uri("https://example.com"),
                OpeningHours = "Mo-Fr 08:00-17:00",
            ;
        
        var jsonLdlb = localbusiness.ToString();
        var organization = new Organization()
            
                AreaServed = "US",
                ContactPoint = new ContactPoint()
                
                    AvailableLanguage = "English",
                    ContactOption = ContactPointOption.TollFree,
                    ContactType = "customer service",
                    Telephone = "1234 1243567"
                ,
                Url = new Uri("https://example.com"),
                Logo = new Uri("https://example.com/graphics/logo.svg"),
            ;
            var jsonLdorg = organization.ToString();
    
<script type="application/ld+json">
    @Html.Raw(jsonLd)
</script>
<script type="application/ld+json">
    @Html.Raw(jsonLdlb)
</script>
<script type="application/ld+json">
    @Html.Raw(jsonLdorg)
</script>

【问题讨论】:

【参考方案1】:
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
@
   string myValue = Configuration["FrameworkData:PageTitle"];
   // Do your things

Refer Microsoft Docs

【讨论】:

在字符串之前没有 private 是一样的吗?..这显然对我没有帮助,仍然得到同样的错误...... 能否请您提供 UI 的完整代码?我只是想看看你如何以及在哪里注入东西 UI 本身没有问题。但我会在更新的问题中发布起始代码,请稍等。 调试这一行时会发生什么:Configuration["FrameworkData:PageTitle"]?您是否验证了您的 json 文件也具有正确的条目为“FrameworkData:PageTitle”? debug this line 是什么意思?它是RCL,所以它本身当然不包含JSON文件,但它应该是这样的。还是超出范围,因为库无法访问主 Web 应用程序中的文件?【参考方案2】:

我必须在另一个代码块中定义有问题的代码块之外的变量,如下所示:

@
    var pageTitle = Configuration["FrameworkData:PageTitle"];

我必须在初始化 WebSite() 实例之前定义 altName

var altName = $"pageTitle - slogan";
var website = new WebSite()

然后我可以通过变量名来引用变量。

结案。

【讨论】:

这和我之前告诉你的一样。我昨天的评论“我的意思是,您可以在“字符串 altName.........”处放置一个断点并检查为配置填充了哪些值。否则为什么您之前不想访问这些配置值创建一个新网站??? 我的意思是在这行之前 --> var website = new WebSite() " 很高兴 :) 接受你的回答

以上是关于如何在剃刀页面 C# 代码块中注入 appsettings.json 配置?的主要内容,如果未能解决你的问题,请参考以下文章

如何将剃刀页面包含在另一个剃刀页面中?

在剃刀视图引擎中转义@字符

如何从我的视图的 javascript 访问我的代码隐藏文件中的 JsonResult 变量?剃刀页面。 C#

如何使剃刀视图引擎使用c# 6.0

@foreach 循环中的多种形式。如何使用 javascript 异步提交一个。 C# 核心剃刀

如何使用对象 MVC 5 C# 的 Javascript 列表填充剃刀 DropDownListFor