Передача аргументов между представлениями MVC для сопоставления элемента из источника данных, доступного в модели
У меня есть представление, которое отображает боковую панель для страницы содержимого. Боковая панель может отображаться несколько раз на одной странице. Макет страницы определяет несколько разделов контента (или позиций в терминологии Kooboo), которые на реальной странице связаны с конкретными представлениями. В каждом таком представлении мне необязательно визуализировать боковую панель, перерисовывая общий вид боковой панели.
Содержание боковых панелей хранится в базе данных Kooboos. Я использую определенный тип контента, который для простоты имеет следующие два поля:
Position
- идентификатор позиции на странице, который совпадает с идентификатором позиции, определенной в макетеContent
- HTML-фрагмент, который представляет собой фактическое содержание боковой панели
Логика представления боковой панели должна быть следующей: из всех данных боковой панели, привязанных к текущей странице, выберите один элемент с Position
сопоставление позиции, переданной из внешнего представления в качестве аргумента, и, если она найдена, ее визуализация. Проблема в том, что я не могу найти способ передать аргументы в представление
Пример макета фрагмента:
<!-- Header section -->
<section>
<div class="section-content">
@Html.FrontHtml().Position("Header")
@Html.FrontHtml().Position("HeaderSectionContent")
</div>
</section>
<!-- Main section -->
<section class="even">
<div class="section-content">
@Html.FrontHtml().Position("MainSectionContent")
</div>
</section>
Образец представления привязан к Header
позиция:
<div class="header-container">
<h1 class="page-title" @ViewHelper.Edit(ViewBag.Solution, "Title")>
@ViewBag.Solution.Title
</h1>
<!-- How to pass "Header" string as an argument into the Controls.Sidebar view? -->
@Html.FrontHtml().RenderView("Controls.Sidebar",ViewData)
<h2 @ViewHelper.Edit(ViewBag.Solution, "Perex")>
@Html.Raw(ViewBag.Solution.Perex)
</h2>
</div>
Предполагаемый общий вид боковой панели Controls.Sidebar
:
@if (ViewBag.Sidebars != null)
{
// How to retrieve an argument and select the matching side bar data?
var sidebar = ViewBag.Sidebars ... ;
if (sidebar != null)
{
<div class="side-bar">
<h3>@item.Title</h3>
@Html.Raw(item.Content)
</div>
}
}
В конце дня мне нужно несколько раз отобразить это представление и условно отобразить несколько боковых панелей в отношении доступности данных.
Я просматривал определения параметров, доступные в редакторе представлений, но, похоже, он обеспечивает доступ к параметрам строки запроса, что не является механизмом, который я мог бы (хотел бы) использовать. В документации Kooboo отсутствует какая-либо информация, связанная с этой темой.
1 ответ
Существует как минимум два способа передачи некоторых параметров из одного представления в другое в Kooboo:
Сначала вы можете сохранить значение вашего параметра в родительском представлении следующим образом:
Context.Items["ParameterName"]=value;
или вот так:
var customViewData = new ViewDataDictionary();
customViewData.Add("ParameterName", value);
Затем вы можете вызвать рендеринг дочернего представления:
@Html.FrontHtml().RenderView("ChildViewName", ViewData) //a default ViewData passed
или как следующее, соответственно:
@Html.FrontHtml().RenderView("ChildViewName", customViewData)
На принимающей стороне в ChildViewName вы просто выбираете значение параметра либо так:
var value = Context.Items["ParameterName"];
или, соответственно, соответственно:
var value = ViewData["ParameterName"]; // NB: don't forget to cast parameter to a proper data-type, because ViewData is not processed same smoothly as ViewBag would.
Оба способа прекрасно работают для этой цели.