2016-08-06 2 views
2

Ich versuche, eine URL für ein Hintergrundbild auf meinem _Layout.cshtml,Kann ich ViewData in MVC Core 1.0 nicht mehr an _Layout.cshtml übergeben?

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

und

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

aber ViewData passieren ist immer leer innen _Layout.cshtml. Funktioniert das wie beabsichtigt? Ich würde lieber nicht auf die BaseViewModel/BaseController Route gehen, da sich das wie Overkill anfühlt.

BEARBEITEN: Es scheint, als ob ViewData im Konstruktor gesetzt ist, wird nicht wirklich verwendet, weil sobald eine Aktion ausgeführt wird, ist die Sammlung leer. Wenn ich innerhalb der Aktion ViewData setze, dann werden diese Daten an _Layout.cshtml weitergeleitet - fühlt sich an wie ein Fehler für mich.

Antwort

3

können Sie eine Aktion Filter verwenden ViewData für alle Controller-Aktionen zu setzen:

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() 
{ 

} 

oder außer Kraft setzen nur OnActionExecuted Methode der Steuerung:

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"; 
     } 
    } 
1

Erweiterung auf adem caglin ‚s Antwort, die ich ging mit dieser Filter-Attribut, das eine beliebige URL nehmen:

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

und wird wie folgt verwendet:

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