Я пытаюсь поделиться данными из моего основного _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 заполняется только в _Layout. Вот почему я также пытаюсь передать данные с родительской страницы на дочернюю страницу PageData [""] без использования контроллера.
ViewBag необходимо заполнить в контроллере, по какой конкретной причине вы делаете это в Layout?
Да, это потому, что я не обязательно нажимаю на контроллер, чтобы отобразить представление с использованием этого _Layout
Как тут не попасть в контроллер !!?
Это потому, что веб-сайт представляет собой приложение MVC, работающее также со статической страницей, созданной с помощью CMS. Все страницы используют один и тот же _Layout, поэтому я хочу иметь возможность делиться данными (ViewBag или что-то еще)
будьте осторожны с ху проблема. это когда вы спрашиваете X, но ваша настоящая проблема - Y
Я не думаю, что иметь -2 это справедливо, но это нормально. Обмен данными между представлениями - это, на мой взгляд, хороший вопрос. Так что, пожалуйста, @Mark, развивайся.
почему вы думаете, что это я голосую против? Я сказал «будьте осторожны», я не сказал «ЭТО».
Это не для отрицательного голоса, это для проблемы xy. Я попытался написать свой вопрос как можно проще, но с достаточной информацией, чтобы понять проблему. Я прочитал вашу статью и в принципе не стал бы спрашивать правильно. Это не критик, мне просто интересен ваш комментарий и почему вы его написали. Что вы не поняли в моем вопросе?
неплохо было бы также включить предысторию вашей проблемы. например, почему вы хотите только объявить свой viewbag в макете? это потому, что он читает какую-то конфигурацию или некоторую базу данных? как вы используете панель просмотра в ваших обзорах внутри renderbody()? это только в некоторых обзорах? или это в каждом просмотре? почему бы вам не создать еще один общедоступный / общий просмотр с этим представлением. а можно просто отрендерить?
@Mark Спасибо за ваш комментарий, я собираюсь отредактировать свой вопрос, чтобы добавить больше деталей.





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, но, как я сказал в своем комментарии, я не обязательно нажимаю на контроллер, чтобы отобразить представление. Я отредактировал свой пост, чтобы объяснить, что хочу делиться данными без использования кода в серверной части.
Да, вы можете использовать viewBag в частичном представлении. При вызове viewBag в файле razor (.cshtml) вы должны вернуть частичный вид для отображения.
Вы заполняете ViewBag в своем контроллере?