Передача аргументов между представлениями 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. 

Оба способа прекрасно работают для этой цели.

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