Configuration.GetSection возвращает нулевое значение
Я не могу получить Configuration.GetSection
вернуть данные в .Value
, Я думаю, что я выполнил все предложения из этого вопроса, но все еще не могу заставить его работать.
appsettings.json
{
"AmazonSettings": {
"BaseUrl": "https://testing.com",
"ClientID": "123456",
"ResponseType": "code",
"RedirectUri": "https://localhost:44303/FirstTimeWelcome"
},
}
Запускать:
public IConfiguration Configuration { get; }
public Startup(IHostingEnvironment env)
{
//Set up configuration sources.
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
ConfigurationServices:
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<AmazonSettings>(Configuration.GetSection("AmazonSettings"));
services.AddMvc()
Класс AmazonSettings:
public class AmazonSettings
{
public string BaseUrl { get; set; }
public string ClientID { get; set; }
public string RedirectUri { get; set; }
public string ResponseType { get; set; }
}
Я пытаюсь получить доступ к AmazonSettings.Value через IOptions:
public class HomeController : Controller
{
private readonly AmazonSettings _amazonSettings;
public IActionResult Index()
{
ViewBag.LoginUrl = _amazonSettings.BaseUrl;
return View("/Pages/Index.cshtml"); ;
}
public HomeController(IOptions<AmazonSettings> amazonSettings)
{
_amazonSettings = amazonSettings.Value;
}
Когда я отлаживаю, значение пусто:
1 ответ
Моя проблема заключалась в том, что мой код в HomeController никогда не попадал под удар.
Я мог туда добраться, и.Value был заполнен, если бы я добавил Routes["home"] над моим контроллером и перешел к localhost/home. Однако я не смог использовать Routes[""], потому что я использую страницы Razor, и это вызвало исключение ambiguousActionException.
Затем я понял, что мне вообще не нужно использовать контроллер с Razor Pages. Я мог бы просто получить доступ к своим данным напрямую из Index.cshtml.cs
public class IndexModel : PageModel
private readonly AmazonSettings _amazonSettings;
public string LoginUrl;
public IndexModel(IOptions<AmazonSettings> amazonSettings)
{
_amazonSettings = amazonSettings.Value;
}
Со следующим доступом на моей странице Index.cshtml:
<a href=@Model.LoginUrl><h1>@Model.LoginUrl</h1></a>
Оказывается, что при отладке.Value, возвращаемое GetSection в коде запуска, может быть нулевым, однако оно заполняется к тому времени, когда достигает IndexModel.