重用动态 object (CurrentPage) 并将其传递给局部视图 MVC Umbraco

Reuse and pass dynamic object (CurrentPage) to Partial View MVC Umbraco

我对 MVC 有点陌生(6 个月),我喜欢使用尽可能少的代码,尤其是涉及到可重用代码等时。我使用的是 Umbraco v7.2,而且我有 (3) 个选项卡,所有选项卡都使用相同的数据类型(自定义网格 v7)。

网格有 (4) 个字段。基本上我页面上的所有 (3) 个部分都是相同的,但 header 和 object 的例外情况被调用(动态 object 是其中具有属性的内容选项卡,正如我之前所说,是相同的)。

如何调用局部视图并重复使用相同的代码? "foreach" 是我需要调用此部分视图的地方,正如您所看到的,它使用相同的代码,但 object 被迭代。

"CurrentPage.XXXX"是我需要传递的,我可以有相同的迭代器

@foreach(var XXXX in CurrentPage.XXXX)   <---- partial view

查看:

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
    Layout = "Master.cshtml";
}

    <article class="accordion-wrapper">
        <div class="accordion-container accordion-contact">
            <a href="javascript:void(0);" class="mont-bold accordion">Leadership Team</a>
            @foreach (var leadership in CurrentPage.leadershipTeam)
            {
                <section class="clearfix">
                    <div class="col-md-6 col-sm-6">
                        <ul>
                            <li>@leadership.contactName</li>
                            <li>@leadership.contactTitle</li>
                        </ul>
                    </div>
                    <aside class="col-md-6 col-sm-6">
                        <ul>
                            <li>@leadership.contactPhone</li>
                            <li>
                                <a href="mailto:@leadership.contactEmail">@leadership.contactEmail</a>
                            </li>
                        </ul>
                    </aside>
                </section>
            }
        </div>
    </article>
    <article class="accordion-wrapper">
        <div class="accordion-container accordion-contact">
            <a href="javascript:void(0);" class="mont-bold accordion">The Lenders One Team</a>
            @foreach (var lenders in CurrentPage.lendersTeam)
            {
                <section class="clearfix">
                    <div class="col-md-6 col-sm-6">
                        <ul>
                            <li>@lenders.contactName</li>
                            <li>@lenders.contactTitle</li>
                        </ul>
                    </div>
                    <aside class="col-md-6 col-sm-6">
                        <ul>
                            <li>@lenders.contactPhone</li>
                            <li>
                                <a href="mailto:@lenders.contactEmail">@lenders.contactEmail</a>
                            </li>
                        </ul>
                    </aside>
                </section>
            }
        </div>
    </article>

    .... another one here but omitted for brevity

并把它变成:

    <article class="accordion-wrapper">
        <div class="accordion-container accordion-contact">
            <a href="javascript:void(0);" class="mont-bold accordion">Leadership Team</a>
            @Html.Partial( ?????? )
        </div>
    </article>
    <article class="accordion-wrapper">
        <div class="accordion-container accordion-contact">
            <a href="javascript:void(0);" class="mont-bold accordion">The Lenders One Team</a>
            @Html.Partial( ?????? )
        </div>
    </article>

部分 ???

            @foreach (var contact in ??????)
            {
                <section class="clearfix">
                    <div class="col-md-6 col-sm-6">
                        <ul>
                            <li>@contact.contactName</li>
                            <li>@contact.contactTitle</li>
                        </ul>
                    </div>
                    <aside class="col-md-6 col-sm-6">
                        <ul>
                            <li>@contact.contactPhone</li>
                            <li>
                                <a href="mailto:@contact.contactEmail">@contact.contactEmail</a>
                            </li>
                        </ul>
                    </aside>
                </section>
            }

欣赏 ;)


编辑:

澄清一下,我之前在 Umbraco 中使用过局部视图。上面的问题是我有 (3) 个不同的 objects (grids in u7)。网格在 Umbraco 中的工作方式是您创建一个新的数据类型,并在该数据类型(文本框、媒体选择器等)中定义某些字段。然后您可以将属性添加到文档类型(在本例中我使用了我创建的自定义网格)。创建页面后,基于文档类型,属性将被继承。

对于联系页面,我需要 (3) 个单独的网格。但是,每个网格中都有不同的数据。因此这是 (3) 个不同的 JSON objects,我对其进行了迭代。上面代码中,(3)JSONobject是:

  1. 领导团队
  2. 贷方团队
  3. avisoryBoard(省略的那个 简洁)

如何将 (CurrentPage.JSONobjectHere) 传递给局部视图,对所有三个部分仅使用一个局部视图

这并不太难。在对partial的调用中,只需使用partial的name即可。这是不带扩展名的部分文件名。当前的 "Model" 也可以在您的部分中使用,而无需将某些内容传递给部分。

<article class="accordion-wrapper">
    <div class="accordion-container accordion-contact">
        <a href="javascript:void(0);" class="mont-bold accordion">Leadership Team</a>
        @Html.Partial("NameOfThePartialWithoutExtention")
    </div>
</article>

如果您继承自 UmbracoTemplatePage or the UmbracoViewPage,那么您可以像在视图本身中一样使用该模型。

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@foreach (var contact in CurrentPage.Children)
{
    <section class="clearfix">
        <div class="col-md-6 col-sm-6">
            <ul>
                <li>@contact.contactName</li>
                <li>@contact.contactTitle</li>
            </ul>
         </div>
     </section>
 }        

做过一次类似的事情。

像这样调用你的部分:

@Html.Partial("YourPartialName", (object)CurrentPage.lendersTeam)

然后在您的部分中使用动态作为模型:

@model dynamic
@foreach (var contact in Model)
            {
                <section class="clearfix">
                    <div class="col-md-6 col-sm-6">
                        <ul>
                            <li>@contact.contactName</li>
                            <li>@contact.contactTitle</li>
                        </ul>
                    </div>
                    <aside class="col-md-6 col-sm-6">
                        <ul>
                            <li>@contact.contactPhone</li>
                            <li>
                                <a href="mailto:@contact.contactEmail">@contact.contactEmail</a>
                            </li>
                        </ul>
                    </aside>
                </section>
            }

感谢 Morten OC。竖起大拇指。我正在使用 NestedContent 并调用 Partial 视图来呈现 IPublishedContent,但也想访问 CurrentPage。

首先对对象进行简单转换。为了详细说明,这里有一些额外的代码以防有人需要相同的代码 -

    Html.RenderPartial("~/Views/Partials/MyPartial.cshtml", 
                        item, //for me this is an IPublishedContent
                        new ViewDataDictionary { { "CurrentPage", (object)CurrentPage } });

然后在我的部分中,为简洁起见缩短了 -

@inherits Umbraco.Web.Mvc.UmbracoViewPage<IPublishedContent>
@{
    dynamic CurrentPage = ViewBag.CurrentPage;
}

<p>@CurrentPage.Name</p>

所以我的模型是 IPublishedContent(因为我正在遍历嵌套内容)

然后在 ViewBag 中,您将获得对 CurrentPage 的引用。我将它命名为 CurrentPage,这样我就可以继续使用 CurrentPage,就像我们通常在 Umbraco 中所做的那样。

干杯莫腾 H5YR