【问题标题】:Pass ViewData to all actions without having to write it every time将 ViewData 传递给所有操作,而不必每次都编写它
【发布时间】:2018-10-09 13:37:50
【问题描述】:

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

这我也可以确认是有效的。如果我只是在其中一个操作中设置 viewbag 数据,这些值就会被拉出。

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);
}

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

如何做到这一点?以后还能这样吗?

【问题讨论】:

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


    【解决方案1】:

    实现面向方面功能的 MVC Core 方法与 MVC 5 中的相同。至少有两种方法可以在每个操作之前/之后注入代码:

    А.在您的ControllerBase 中覆盖OnActionExecuting:

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        ViewBag.foo = "1";
    }
    

    或

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

    【讨论】:

    • 我必须将以下内容添加到 ConfgureServices 以使其正常工作,但是是的,就是这样。 services.AddScoped(); SiteSetting 是我的过滤器属性的名称。谢谢,这听起来很简单,这看起来是不可能的,让我从自定义配置文件中更改站点标题等。疯狂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多