Nano Hash - криптовалюты, майнинг, программирование

Установка фона на странице MVC _Layout.cshtml

Настройка фона каждой страницы довольно проста в 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 в отдельных методах контроллера, изображение изменится соответствующим образом. Поэтому мне еще предстоит найти какие-либо проблемы, но могут быть и другие проблемы, связанные с этим подходом.

Итак, еще раз: «Есть ли лучший способ»?


Ответы:


1

Одна возможная проблема, которую я вижу при таком подходе, заключается в том, что разработчик забывает создать подкласс контроллера hist из BaseController.

Использование global action filter гарантирует, что это никогда не произойдет. произойдет, и свойство всегда будет доступно:

public class BackgroundImageFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        context.Controller.ViewBag.url = BingImageLoader.getBingImageUrl();
    }
}

который будет зарегистрирован только один раз в вашем Application_Start:

protected void Application_Start()
{
    ...
    // Register global filter
    GlobalFilters.Filters.Add(new BackgroundImageFilterAttribute());
}

Если вы считаете этот подход к фильтрации громоздким в качестве альтернативы, я могу предложить написать собственный помощник Html, который можно использовать в вашем _Layout.cshtml:

<style type="text/css">
    body {
        background-image: url(@Html.GetBackgroundImageUrl());
        background-repeat: no-repeat;
        background-size: cover;
    }
</style>

который может быть определен как простой метод расширения:

public static class HtmlExtensions
{
    public static IHtmlString GetBackgroundImageUrl(this HtmlHelper html)
    {
        string url = BingImageLoader.getBingImageUrl();
        return new HtmlString(url);
    }
}
14.03.2015
  • И фильтр действий, и метод расширения работают одинаково хорошо и избавляют от необходимости создавать подклассы. Как показано выше, переопределение OnActionExecuted установит фон 14.03.2015
  • OnActionExecuted установит фон для всех страниц для каждого контроллера, в то время как для моей непосредственной цели переопределение OnActionExecuting доказывает лучший выбор, позволяя мне назначать ViewBag.url в любом методе контроллера. Как ни странно, у меня оба переопределения работают без привязки какого-либо атрибута к контроллеру или методу. В случае с HtmlExtensions я нахожу их гораздо более неудобными при попытке изменить фон. Для моих требований ActionFilter кажется лучшим вариантом. Спасибо Дарин. 14.03.2015
  • привет, как мне подать в суд на это и установить целевой фон для текущего div (частичный просмотр против просмотра против полного _Layout) 13.02.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..