Макет страницы заголовка:
<head>
<link href="@Url.Content("~/Content/themes/base/Site.css")"
rel="stylesheet" type="text/css" />
</head>
Представление (AnotherView) из приложения требует:
<link href="@Url.Content("~/Content/themes/base/AnotherPage.css")"
rel="stylesheet" type="text/css" />
и AnotherView имеет частичное представление (AnotherPartial), для которого необходимо:
<link href="@Url.Content("~/Content/themes/base/AnotherPartial.css")"
rel="stylesheet" type="text/css" />
Вопрос: Как мы можем добавить эти CSS-файлы к ссылкам AnotherView и AnotherPartial к заголовку Layout ?
RenderSection не очень хорошая идея, потому что AnotherPage может иметь более одного Partials. Добавить весь CSS к заголовку бесполезно, потому что он будет динамически меняться (это зависит от Anotherpages).
asp.net-mvc
asp.net-mvc-3
razor
Нури Йилмаз
источник
источник
Ответы:
Планировка:
Посмотреть:
источник
AddToHead
раздел находится в частичном представлении, встроенном вView
.Обновление : базовый пример доступен по адресу https://github.com/speier/mvcassetshelper
Мы используем следующую реализацию для добавления файлов JS и CSS на страницу макета.
Просмотр или PartialView:
Страница макета:
Расширение HtmlHelper:
источник
Insert
методыAdd
методами[ThreadStatic]
или, предпочтительно, храниться вHttpContext.Items
.К сожалению, по умолчанию это невозможно использовать,
section
как предложил другой пользователь, поскольку asection
доступно только для непосредственногоchild
объекта aView
.Что работает, тем не менее, это реализация и переопределение
section
в каждом представлении , что означает:Таким образом, каждый вид может реализовывать головной раздел, а не только непосредственные дети. Хотя это работает только частично, особенно с множественными частями, начинаются проблемы (как вы упомянули в своем вопросе).
Таким образом, единственным реальным решением вашей проблемы является использование
ViewBag
. Лучшим, вероятно, будет отдельная коллекция (список) для CSS и скриптов. Чтобы это работало, вы должны убедиться, чтоList
используемый инициализирован перед выполнением любого из представлений. Затем вы можете делать такие вещи в верхней части каждого представления / частичного (без заботы, если значениеScripts
илиStyles
равно нулю:Затем в макете вы можете просмотреть коллекции и добавить стили на основе значений в
List
.Я думаю, что это некрасиво, но это единственное, что работает.
****** ОБНОВЛЕНИЕ **** Поскольку он начинает сначала выполнять внутренние представления и прокладывает путь к макету, а стили CSS каскадные, возможно, имеет смысл изменить список стилей через
ViewBag.Styles.Reverse()
.Таким образом, сначала добавляется самый внешний стиль, который в любом случае соответствует тому, как работают таблицы стилей CSS.
источник
Вы можете определить раздел методом RenderSection в макете.
раскладка
Затем вы можете включить ваши CSS-файлы в области раздела в вашем представлении, кроме частичного представления .
Раздел работает в поле зрения, но не работает в частичном виде по замыслу .
Если вы действительно хотите использовать область сечения в частичном представлении, вы можете следовать статье, чтобы переопределить метод RenderSection.
Бритва, вложенные макеты и переопределенные разделы - Marcin на ASP.NET
источник
У меня была похожая проблема, и в итоге я применил превосходный ответ Калмана с кодом ниже (не совсем аккуратный, но, возможно, более расширяемый):
Проект содержит статический метод AssignAllResources:
на странице _layout
и в части (ях) и представлениях
источник
Я пытался решить эту проблему.
Мой ответ здесь.
"DynamicHeader" - http://dynamicheader.codeplex.com/ , https://nuget.org/packages/DynamicHeader
Например, _Layout.cshtml это:
И вы можете зарегистрировать файлы .js и .css в «DynamicHeader» где угодно угодно.
Например, блок кода в AnotherPartial.cshtm:
Затем окончательно выведите HTML:
источник
Попробуйте готовое решение (ASP.NET MVC 4 или более поздняя версия):
источник
CS0103: The name 'BundleTable' does not exist in the current context
System.Web.Optimization
то естьSystem.Web.Optimization.BundleTable.Bundles.GetRegisteredBundles().First(b => b.Path == "~/bundles/css");
Для тех из нас, кто использует ASP.NET MVC 4 - это может быть полезно.
Сначала я добавил класс BundleConfig в папку App_Start.
Вот мой код, который я использовал для его создания:
Во-вторых, я зарегистрировал класс BundleConfig в файле Global.asax:
В-третьих, я добавил помощников по стилю в свой файл CSS:
Наконец, я использовал этот синтаксис в любом представлении:
источник
Вот плагин NuGet под названием Кассета , который, помимо прочего, дает вам возможность ссылаться на скрипты и стили в партиалах.
Хотя для этого плагина доступно несколько конфигураций , что делает его очень гибким. Вот самый простой способ обращения к файлам скрипта или таблицы стилей:
Согласно документации :
источник
Я написал простую оболочку, которая позволяет динамически регистрировать стили и скрипты в каждом частичном представлении в теге head.
Он основан на использовании DynamicHeader jsakamoto, но имеет некоторые улучшения и улучшения.
Он очень прост в использовании и универсален.
Использование:
Вы можете найти полный код, пояснения и примеры внутри: динамически добавлять стили и скрипты в тег заголовка
источник