将ViewData传递给所有操作,而不必每次都写入

时间:2016-05-18 23:36:38

标签: c# asp.net-core-mvc

所有,我只是尝试从加载的.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);
}

但是如果页面再次无法正确加载,我不会在加载页面的操作中指定设置。

如何做到这一点?这可以再做了吗?

1 个答案:

答案 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。第二种方式更灵活(例如,您可以轻松地将过滤器添加到特定操作中)。