Настройка фона каждой страницы довольно проста в ASP.Net WebForms, где у вас есть доступ к событию Page_Load в программном коде MasterPage, но как это лучше всего сделать в MVC? Потратив несколько часов на изучение различных альтернатив, я решил присвоить значение ViewBag через «базовый» контроллер, получить последующие контроллеры из этой базы, а затем получить доступ к этому значению в _Layout.cshtml.
Вот базовый контроллер, в котором я назначаю URL-адрес, указывающий на определенное изображение:
public class BaseController : Controller
{
public BaseController()
{
ViewBag.url = BingImageLoader.getBingImageUrl();
}
}
Следующим шагом является получение последующих контроллеров, в данном случае HomeController из этого базового класса:
public class HomeController : BaseController
{
public ActionResult Index()
{
return View();
}
.
.
И, наконец, используйте ViewBag в элементе head файла _Layout.cshtml, чтобы задать свойство стиля фонового изображения.
.
.
<style type="text/css">
body {
background-image: url(@ViewBag.url);
background-repeat: no-repeat;
background-size: cover;
}
</style>
</head>
Это выполнило то, что я намеревался сделать; однако по пути было указано несколько альтернатив, включая использование ActionFilters. Честно говоря, создание CustomActionFilter и использование ActionFilterAttributes и переопределение OnActionExecuting кажется излишним, но иногда самый простой способ не всегда лучший.
В конечном счете, вопрос сводится к «Есть ли лучший способ?» Есть ли побочные эффекты от введения посредника? Если я переопределю свой ViewBag.url в отдельных методах контроллера, изображение изменится соответствующим образом. Поэтому мне еще предстоит найти какие-либо проблемы, но могут быть и другие проблемы, связанные с этим подходом.
Итак, еще раз: «Есть ли лучший способ»?