如何在剃刀页面 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#