Einstellung der hintergrund in einer MVC-_Layout.cshtml-Seite
Einstellung jeder Seite der hintergrund ist relativ einfach in ASP.Net WebForms, wo Sie Zugriff auf die Page_Load-Ereignis in der code-behind einer MasterPage doch wie ist dies am besten in MVC? Nach mehreren Stunden recherche die verschiedenen alternativen, die ich wählte, um den Wert zuzuweisen, um die ViewBag durch ein "base-controller", leiten sich die nachfolgenden Steuerungen aus, die base und dann auf diesen Wert zugreifen, in der _Layout.cshtml.
Hier ist die Basis-controller, in dem ich eine url zuzuweisen, die Punkte zu einem bestimmten Bild:
public class BaseController : Controller
{
public BaseController()
{
ViewBag.url = BingImageLoader.getBingImageUrl();
}
}
Der nächste Schritt ist die Ableitung von nachfolgenden Controller, in diesem Fall der HomeController aus, dass die Basis-Klasse:
public class HomeController : BaseController
{
public ActionResult Index()
{
return View();
}
.
.
Und schließlich, verwenden Sie den ViewBag in das head-element der _Layout.cshtml, um den hintergrund-Bild, Stil-Eigenschaft.
.
.
<style type="text/css">
body {
background-image: url(@ViewBag.url);
background-repeat: no-repeat;
background-size: cover;
}
</style>
</head>
Diese Tat vollbringen, was ich dargelegt um zu tun; jedoch, auf dem Weg gab es eine Reihe von alternativen angegeben, einschließlich der Verwendung von ActionFilters. Um ehrlich zu sein, die Schaffung eines CustomActionFilter und mit ActionFilterAttributes und überschreiben OnActionExecuting scheint wie overkill, aber manchmal der einfachste Weg ist nicht immer der beste.
Letztlich kommt die Frage auf "gibt es einen besseren Weg?" Gibt es Nebenwirkungen durch die Einführung der Vermittler? Wenn ich das überschreiben meiner ViewBag.url in die einzelnen controller-Methoden, das Bild ändert sich entsprechend. So habe ich noch irgendwelche Probleme finden, aber möglicherweise gibt es andere Probleme, die aus diesem Ansatz.
Also wieder, "gibt es eine bessere Art und Weise"?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem möglichen problem, das ich sehen kann mit diesem Ansatz ist, wenn der Entwickler vergisst, Unterklasse hist controller von
BaseController
.Mit einem
global action filter
würde sicherstellen, dass dies nie geschehen wird, und die Eigenschaft immer zur Verfügung:denen registriert werden, die nur einmal in Ihrem
Application_Start
:Wenn Sie diese filter-Ansatz umständlich als eine alternative, die ich vorschlagen kann, schreiben Sie eine benutzerdefinierte Html-helper verwendet werden konnten, in Ihrer
_Layout.cshtml
:die definiert werden könnte als eine einfache Erweiterung Methode: