Dans appsettings.json
{
"MyArray": [
"str1",
"str2",
"str3"
]
}
Dans Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
}
Dans HomeController
public class HomeController : Controller
{
private readonly IConfiguration _config;
public HomeController(IConfiguration config)
{
this._config = config;
}
public IActionResult Index()
{
return Json(_config.GetSection("MyArray"));
}
}
Il y a mes codes ci-dessus, je suis nullComment obtenir le tableau?
Si vous voulez choisir la valeur du premier article, faites comme ceci -
var item0 = _config.GetSection("MyArray:0");
Si vous voulez choisir la valeur d'un tableau entier, faites comme ceci:
IConfigurationSection myArraySection = _config.GetSection("MyArray");
var itemArray = myArraySection.AsEnumerable();
Idéalement, vous devriez envisager d'utiliser modèle d'options suggéré par la documentation officielle. Cela vous donnera plus d'avantages.
Vous pouvez installer les deux packages NuGet suivants:
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Binder
Et vous aurez ensuite la possibilité d'utiliser la méthode d'extension suivante:
var myArray = _config.GetSection("MyArray").Get<string[]>();
Ajoutez un niveau dans votre appsettings.json:
{
"MySettings"
"MyArray": [
"str1",
"str2",
"str3"
]
}
}
Créez une classe représentant votre section:
public class MySettings
{
public List<string> MyArray {get; set;}
}
Dans votre classe de démarrage d’application, liez votre modèle et injectez-le dans le service DI:
services.Configure<MySettings>(options => Configuration.GetSection("MySettings").Bind(options));
Et dans votre contrôleur, obtenez vos données de configuration auprès du service DI:
public class HomeController : Controller
{
private readonly List<string> _myArray;
public HomeController(IOptions<MySettings> mySettings)
{
_myArray = mySettings.Value.MyArray;
}
public IActionResult Index()
{
return Json(_myArray);
}
}
Vous pouvez également stocker l'intégralité de votre modèle de configuration dans une propriété de votre contrôleur, si vous avez besoin de toutes les données:
public class HomeController : Controller
{
private readonly MySettings _mySettings;
public HomeController(IOptions<MySettings> mySettings)
{
_mySettings = mySettings.Value;
}
public IActionResult Index()
{
return Json(_mySettings.MyArray);
}
}
Le service d'injection de dépendance du noyau ASP.NET fonctionne comme un charme :)
Si vous avez un tableau d'objets JSON complexes comme celui-ci:
{
"MySettings": {
"MyValues": [
{ "Key": "Key1", "Value": "Value1" },
{ "Key": "Key2", "Value": "Value2" }
]
}
}
Vous pouvez récupérer les paramètres de cette façon:
var valuesSection = configuration.GetSection("MySettings:MyValues");
foreach (IConfigurationSection section in valuesSection.GetChildren())
{
var key = section.GetValue<string>("Key");
var value = section.GetValue<string>("Value");
}
Cela a fonctionné pour moi pour retourner un tableau de chaînes de ma config:
var allowedMethods = Configuration.GetSection("AppSettings:CORS-Settings:Allow-Methods")
.Get<string[]>();
Ma section de configuration ressemble à ceci:
"AppSettings": {
"CORS-Settings": {
"Allow-Origins": [ "http://localhost:8000" ],
"Allow-Methods": [ "OPTIONS","GET","HEAD","POST","PUT","DELETE" ]
}
}
Dans ASP.NET Core 2.2 et versions ultérieures, nous pouvons injecter IConfiguration n'importe où dans notre application, comme dans votre cas. Vous pouvez injecter IConfiguration dans HomeController et l'utiliser comme ceci pour obtenir le tableau.
string[] array = _config.GetSection("MyArray").Get<string[]>();
C'est une vieille question, mais je peux donner une réponse mise à jour pour .NET Core 2.1 avec les normes C # 7. Dites que je possède une liste uniquement dans appsettings.Development.json, par exemple:
"TestUsers": [
{
"UserName": "TestUser",
"Email": "[email protected]",
"Password": "P@ssw0rd!"
},
{
"UserName": "TestUser2",
"Email": "[email protected]",
"Password": "P@ssw0rd!"
}
],
Je peux les extraire n'importe où que Microsoft.Extensions.Configuration.IConfiguration soit implémenté et câblé comme suit:
var testUsers = Configuration.GetSection("TestUsers")
.GetChildren()
.ToList()
//Named Tuple returns, new in C# 7
.Select(x =>
(
x.GetValue<string>("UserName"),
x.GetValue<string>("Email"),
x.GetValue<string>("Password")
)
)
.ToList<(string UserName, string Email, string Password)>();
Maintenant, j'ai la liste d'un objet bien typé et bien typé. Si j'utilise testUsers.First (), Visual Studio doit maintenant afficher les options pour 'Nom d'utilisateur', 'E-mail' et 'Mot de passe'.
Vous pouvez obtenir le tableau directement sans incrémenter un nouveau niveau dans la configuration:
public void ConfigureServices(IServiceCollection services) {
services.Configure<List<String>>(Configuration.GetSection("MyArray"));
//...
}
Pour le cas du retour d'un tableau d'objets JSON complexes à partir de la configuration, j'ai adapté la réponse de @ djangojazz afin d'utiliser des types anonymes et dynamiques plutôt que des tuples.
Étant donné une section de paramètres de:
"TestUsers": [
{
"UserName": "TestUser",
"Email": "[email protected]",
"Password": "P@ssw0rd!"
},
{
"UserName": "TestUser2",
"Email": "[email protected]",
"Password": "P@ssw0rd!"
}],
Vous pouvez retourner le tableau d'objets de cette façon:
public dynamic GetTestUsers()
{
var testUsers = Configuration.GetSection("TestUsers")
.GetChildren()
.ToList()
.Select(x => new {
UserName = x.GetValue<string>("UserName"),
Email = x.GetValue<string>("Email"),
Password = x.GetValue<string>("Password")
});
return new { Data = testUsers };
}
Forme courte:
var myArray= configuration.GetSection("MyArray")
.AsEnumerable()
.Where(p => p.Value != null)
.Select(p => p.Value)
.ToArray();
Il retourne un tableau de chaîne:
{"str1", "str2", "str3"}