所有,我只是尝试从加载的.config文件中读取自定义值到MVC项目中。
所以我在添加的.config文件中设置了如下所示的值:
"AppSettings": {
"Title": "Mobile Site"
}
我已经制作了一个基础控制器来设置值
public abstract class ControllerBase : Controller
{
protected Models.AppSettings _appSettings;
private IConfiguration _config;
public ControllerBase(IConfiguration config)
{
_config = config;
_appSettings = new Models.AppSettings();
_appSettings.SiteTitle = _config.GetSection("AppSettings").GetSection("Title").Value;
ViewBag.Settings = _appSettings;
}
}
我也可以确认这是有效的。如果我只是在我的一个动作中设置视包数据,那么这些值就会被拉过来。
public class AppController : ControllerBase
{
public AppController(IConfiguration config) : base(config)
{
}
// GET: /<controller>/
public IActionResult Index()
{
ViewData["Settings"] = _appSettings;
return View("Index");
}
我可以通过这种方式访问视图中的值,但是因为我正在添加的值只是网站标题的内容(因此我可以在简单的.config文件中配置这些内容)我想要的东西像每个动作都要传递给每个动作的网站标题,而不必每次都为每一个动作专门传递它。
我尝试按照视频显示此功能的视频:
@{
ViewData["Logo"] = "~/img/bird.png";
ViewData["Icon"] = "~/img/logo.ico";
var Settings = ((Mobile.Models.AppSettings)ViewBag.Settings);
}
但是如果页面再次无法正确加载,我不会在加载页面的操作中指定设置。
如何做到这一点?这可以再做了吗?
答案 0 :(得分:5)
实现面向方面功能的MVC Core方法与MVC 5相同。在每个操作之前/之后至少有两种方法注入代码:
А。覆盖OnActionExecuting
中的ControllerBase
:
public override void OnActionExecuting(ActionExecutingContext context)
{
ViewBag.foo = "1";
}
OR
B中。将ActionFilter
添加到控制器(过滤器必须在DI中注册):
public class TestFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
ViewBag.foo = "1";
base.OnActionExecuting(context);
}
}
[ServiceFilter(typeof(TestFilter))]
public class TestController : Controller
{
}
更多示例:Asp.net Core 1.0 Action Filters。第二种方式更灵活(例如,您可以轻松地将过滤器添加到特定操作中)。