Обмен данными из Layout в RenderBody

Я пытаюсь поделиться данными из моего основного _Layout в представлениях, отображаемых RenderBody.

Я попытался использовать ViewBag, инициализированный в «Shared / _Layout», но это не сработало. Однако я заметил, что этот ViewBag можно использовать частично, но не в представлениях, отображаемых @RenderBody.

Пример _Layout:

PageData["XX"] = "myValue";
ViewContext.Controller.ViewBag.XX= "myValue";
Page.XX= "myValue"; 
ViewBag.XX= "myValue";
ViewContext.ViewData["XX"] = "myValue";

<body>
    @Html.Partial("_MyPartial") // Everything has the correct value in the partial

    <main class = "content">
        @RenderBody() // Everything is null in that view
    </main>
</body>

Я пробовал использовать ViewBag.Property, ViewData ["Property"], Page.Property и PageData ["Property"], но все они равны нулю в представлении, отображаемом RenderBody. Кажется, потому что Layout - последний скомпилированный элемент.

Я не хочу использовать какой-либо код. Все должно быть в поле зрения, сделайте что-нибудь похожее на мой пример выше. Он должен быть в макете, потому что значение, которым я хочу поделиться, определяется пользователем через CMS. Это означает, что этот макет используется статической страницей, но также и представлениями, отображаемыми контроллером.

Мой вопрос: как я могу предоставить / поделиться данными из _Layout в мои представления, отображаемые RenderBody ()?

Вы заполняете ViewBag в своем контроллере?

Hooman Bahreini 03.07.2018 10:22

ViewBag заполняется только в _Layout. Вот почему я также пытаюсь передать данные с родительской страницы на дочернюю страницу PageData [""] без использования контроллера.

Tyler Durden 03.07.2018 10:25

ViewBag необходимо заполнить в контроллере, по какой конкретной причине вы делаете это в Layout?

Hooman Bahreini 03.07.2018 10:29

Да, это потому, что я не обязательно нажимаю на контроллер, чтобы отобразить представление с использованием этого _Layout

Tyler Durden 03.07.2018 10:33

Как тут не попасть в контроллер !!?

Hooman Bahreini 03.07.2018 10:35

Это потому, что веб-сайт представляет собой приложение MVC, работающее также со статической страницей, созданной с помощью CMS. Все страницы используют один и тот же _Layout, поэтому я хочу иметь возможность делиться данными (ViewBag или что-то еще)

Tyler Durden 03.07.2018 10:40

будьте осторожны с ху проблема. это когда вы спрашиваете X, но ваша настоящая проблема - Y

Mark 03.07.2018 10:42

Я не думаю, что иметь -2 это справедливо, но это нормально. Обмен данными между представлениями - это, на мой взгляд, хороший вопрос. Так что, пожалуйста, @Mark, развивайся.

Tyler Durden 03.07.2018 10:55

почему вы думаете, что это я голосую против? Я сказал «будьте осторожны», я не сказал «ЭТО».

Mark 03.07.2018 11:01

Это не для отрицательного голоса, это для проблемы xy. Я попытался написать свой вопрос как можно проще, но с достаточной информацией, чтобы понять проблему. Я прочитал вашу статью и в принципе не стал бы спрашивать правильно. Это не критик, мне просто интересен ваш комментарий и почему вы его написали. Что вы не поняли в моем вопросе?

Tyler Durden 03.07.2018 11:05

неплохо было бы также включить предысторию вашей проблемы. например, почему вы хотите только объявить свой viewbag в макете? это потому, что он читает какую-то конфигурацию или некоторую базу данных? как вы используете панель просмотра в ваших обзорах внутри renderbody()? это только в некоторых обзорах? или это в каждом просмотре? почему бы вам не создать еще один общедоступный / общий просмотр с этим представлением. а можно просто отрендерить?

Mark 03.07.2018 11:19

@Mark Спасибо за ваш комментарий, я собираюсь отредактировать свой вопрос, чтобы добавить больше деталей.

Tyler Durden 04.07.2018 03:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
12
244
4

Ответы 4

ViewBag и ViewData зависят от вида, поэтому они очищаются, когда вы нажимаете на другой View / Action. Попробуйте проверить эту ссылку http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications для получения дополнительной информации.

Попробуйте использовать TempData для этого эффекта - http://www.tutorialsteacher.com/mvc/tempdata-in-asp.net-mvc

попробуйте это в своем макете:

@ViewContext.Controller.ViewBag.Test= "test";

How I can give/share data to my views rendered by RenderBody()?

Контроллеры несут ответственность за подготовку данных (модель, ViewBag, TempData и т. д.) И передачу их представлениям.

Вы также можете изучить фильтры для подготовки данных.


Вам необходимо заполнить ViewBag в вашем контроллере:

public class HomeController
{
    public ActionResult Index()
    {
        // populate your ViewBag
        ViewBag.myValue = "some text";
    }
}

А затем в вашем View / PartialView вы можете использовать его следующим образом:

MyPartialView.cshtml

<label>@ViewBag.myValue</label>

Спасибо, Hooman, но, как я сказал в своем комментарии, я не обязательно нажимаю на контроллер, чтобы отобразить представление. Я отредактировал свой пост, чтобы объяснить, что хочу делиться данными без использования кода в серверной части.

Tyler Durden 04.07.2018 03:19

Да, вы можете использовать viewBag в частичном представлении. При вызове viewBag в файле razor (.cshtml) вы должны вернуть частичный вид для отображения.

Другие вопросы по теме