Asp.net mvc 我不能再将ViewData传递到MVC Core 1.0中的_Layout.cshtml吗?

Asp.net mvc 我不能再将ViewData传递到MVC Core 1.0中的_Layout.cshtml吗?,asp.net-mvc,razor,asp.net-core,Asp.net Mvc,Razor,Asp.net Core,我正在尝试将背景图像的URL传递给我的\u Layout.cshtml public HomeController() { this.ViewData["BackgroundImage"] = "1920w/Stipula_fountain_pen.jpg"; } 及 ... 但是ViewData在\u Layout.cshtml中总是空的。这是否符合预期?我不想沿着BaseViewModel/BaseController的路线走下去,因为这感觉太过分了 编辑:似乎构造函数中设置的

我正在尝试将背景图像的URL传递给我的
\u Layout.cshtml

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


...
但是
ViewData
\u Layout.cshtml
中总是空的。这是否符合预期?我不想沿着
BaseViewModel/BaseController
的路线走下去,因为这感觉太过分了


编辑:似乎构造函数中设置的
ViewData
没有实际使用,因为一旦某个操作执行,集合就为空。如果我在操作中设置了
ViewData
,则该数据将传递到
\u Layout.cshtml
-我觉得这是一个bug。

您可以使用操作过滤器为所有控制器操作设置
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";
        }
    }
我使用了这个filter属性展开了对的回答,它可以接受任意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
{
    ...
}
[SetBackgroundUrl(Url = "1920w/Stipula_fountain_pen.jpg")]
public class HomeController : Controller
{
    ...
}