【问题标题】:Can I no longer pass ViewData to _Layout.cshtml in MVC Core 1.0?我可以不再在 MVC Core 1.0 中将 ViewData 传递给 _Layout.cshtml 吗?
【发布时间】:2016-08-06 14:27:04
【问题描述】:

我正在尝试将背景图片的 URL 传递给我的_Layout.cshtml

public HomeController()
{
    this.ViewData["BackgroundImage"] = "1920w/Stipula_fountain_pen.jpg";
}

<body style="background-image: url(@(string.Format("assets/images/{0}", ViewData["BackgroundImage"])))">
    ...
</body>

ViewData_Layout.cshtml 中始终为空。这是否按预期工作?我宁愿不走BaseViewModel/BaseController 路线,因为那感觉有点矫枉过正。

编辑:似乎ViewData 在构造函数中设置并没有实际使用,因为一旦执行操作,集合就是空的。如果我在操作中设置ViewData,那么该数据将传递给_Layout.cshtml - 对我来说就像一个错误。

【问题讨论】:

    标签: asp.net-mvc razor asp.net-core


    【解决方案1】:

    您可以使用操作过滤器为所有控制器操作设置ViewData

    public class SetBackgroundUrlAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
            var result = filterContext.Result as ViewResult;
            if (result != null)
            {
                result.ViewData["BackgroundImage"] = "1920w/Stipula_fountain_pen.jpg";
            }
        }
    }
    
    [SetBackgroundUrl]
    public HomeController()
    {
    
    }
    

    或者直接覆盖控制器的OnActionExecuted方法:

        public override void OnActionExecuted(ActionExecutedContext context)
        {
            base.OnActionExecuted(context);
            var result = context.Result as ViewResult;
            if (result != null)
            {
                result.ViewData["BackgroundImage"] = "1920w/Stipula_fountain_pen.jpg";
            }
        }
    

    【讨论】:

      【解决方案2】:

      扩展adem caglin 的答案我使用了这个过滤器属性,它可以采用任意 URL:

      [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple = false)]
      public class SetBackgroundUrlAttribute : ActionFilterAttribute
      {
          public override void OnActionExecuted(ActionExecutedContext filterContext)
          {
              base.OnActionExecuted(filterContext);
      
              if (!string.IsNullOrWhiteSpace(this.Url))
              {
                  var result = filterContext.Result as ViewResult;
      
                  if (result != null)
                      result.ViewData["BackgroundImage"] = this.Url;
              }
          }
      
          public string Url { get; set; }
      }
      

      并像这样使用:

      [SetBackgroundUrl(Url = "1920w/Stipula_fountain_pen.jpg")]
      public class HomeController : Controller
      {
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-08
        相关资源
        最近更新 更多