我正在尝试使用强类型类读取appsettings.json文件,并将其作为参数传递给控制器。然而它不起作用。这是代码。
appsettings.json文件:
{
"AppSettings": {
"ApplicationName": "TestApp"
}
}
AppSettings类:
public class AppSettings
{
public string ApplicationName { get; set; }
}
在启动类中注入:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddMvc();
services.AddOptions();
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
}
控制器:
public class ValuesController : Controller
{
private readonly IOptions<AppSettings> _appsettings;
public ValuesController(IOptions<AppSettings> appsettings)
{
_appsettings = appsettings;
}
[HttpGet]
public string Get()
{
return _appsettings.Options.ApplicationName;
}
}
启动程序已成功执行。但是,不会调用控制器构造函数或默认的get方法。
它正在工作,如果我从控制器构造函数中删除(IOptions appsettings)。
我的代码有什么问题。
答案 0 :(得分:1)
IOptions.Options在beta8中重命名为IOptions.Value。请参阅this question。
更改您的获取操作:
return _appsettings.Options.ApplicationName;
为:
return _appsettings.Value.ApplicationName;
应该解决这个问题。
更新2016年3月8日
我在这里看到的另一个问题是,您将Get
操作称为“默认”操作,但ASP.Net Core中的默认路由会在控制器上查找Index
操作。
您可以在Startup.cs
中配置路由以默认查找Get
操作,而不是Index
操作,方法是修改Configure
功能以包含以下内容:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Get}/{id?}");
});
默认的implmentation使用模板template: "{controller=Home}/{action=Index}/{id?}"
,这就是它寻找Index
行为的原因。
您的其他选择是将Get
功能更改为Index
功能,在您访问网站时明确指定网址中的Get
操作(例如http://localhost/Values/Get }),或者在控制器中指定Get
方法的操作名称,如下所示:
[HttpGet]
[ActionName("Index")]
public string Get()
{
return _appsettings.Value.ApplicationName;
}