Andy Evans
Andy Evans

Reputation: 7176

Access appsettings.json values in controller classes

Having trouble figuring out how to read appsettings.json values outside of the startup.cs. What I would like to do is, for instance, is in the _Layout.cshtml, add the site name from the config:

For example:

ViewData["SiteName"] = Configuration.GetValue<string>("SiteSettings:SiteName");

Or even better:

public class GlobalVars {
    public static string SiteName => Configuration.GetValue<string>("SiteSettings:SiteName");
}

Here's my code thus far:

[appsettings.json]

"SiteSettings": {
    "SiteName": "MySiteName"
}

[startup.cs]

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    Configuration = builder.Build();

    var siteName = Configuration.GetValue<string>("SiteSettings:SiteName");
}

public IConfigurationRoot Configuration { get; }

Maybe I'm reading the docs wrong, but I can't seem to expose the Configuration object outside of the Startup class.

Upvotes: 28

Views: 38578

Answers (2)

Joel Youngberg
Joel Youngberg

Reputation: 544

Wanted to add an update to this post since I ran into it while searching for Dot Net Core 8 MVC: You now add the following to the builder in Program.cs (which replaced Startup.cs):

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();

// Add IConfiguration to the container
builder.Services.AddSingleton(builder.Configuration);

var app = builder.Build();

Then add the following to the top of your controller with the logger:

private readonly ILogger<HomeController> _logger;
private readonly IConfiguration _appsettings;
  
      public HomeController(ILogger<HomeController> logger, IConfiguration appsettings)
        {
            _logger = logger;
            _appsettings = appsettings;
        }    

After adding these you can then access appsettings.json values in array format as follows:

var businessLocation = _appsettings["Locations:101"];

Where appsettings.json format is as follows (and get the value 1):

"Locations": {
  "101": "1",
  "202": "2",
  "303": "3"
},

Upvotes: 0

Gabriel Ferrarini
Gabriel Ferrarini

Reputation: 961

In your Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IConfiguration>(Configuration);
    }

then in your controller:

public class ValuesController : Controller
{
    IConfiguration configuration;

    public ValuesController(IConfiguration configuration)
    {
        this.configuration = configuration;
    }
}

Upvotes: 58

Related Questions