如何从 Orchard CMS 中分配的内容部分获取值

How to get values from assigned contentpart in Orchard CMS

我正在使用 Orchard CMS v1.8.x。我们添加了 FlexSlider 模块并使其 link 到我们网站的特定区域,我们添加了一个名为 "Slide Link" 的字段到 FlexSliderPart object.

现在,一切都很顺利。但我完全不知道如何在 front-end 上引用这个新字段。 FlexSliderWidgetViewModel 仅包含 Title 和 ImagePath 字段。我不知道如何检索 SlideLink(和副标题)字段:

namespace Tekno.FlexSlider.ViewModels
{
    public class FlexSliderWidgetViewModel
    {
        public string Title { get; set; }
        public string ImagePath { get; set; }


    }
}

我的观点:

@using Tekno.FlexSlider.ViewModels

@{
    Style.Require("FlexSlider");
    Script.Require("FlexSlider");

    var items = (IEnumerable<FlexSliderWidgetViewModel>)Model.SlideItems;
}
<div class="flexslider">
    <ul class="slides">
        @foreach (var item in items)
        {
            <li>
                @if (item.ImagePath != "")
                {
                    <a href="@(/*what must I do here?*/)"><img src="@Display.ResizeMediaUrl(Path: item.ImagePath, Height: 400, Mode: "crop")" /></a>
                }
                <span class="slide-text">@item.Title</span>
            </li>
        }
    </ul>
    <span class="slide-text-bottom"></span>
</div>

Driver的显示函数:

protected override DriverResult Display(FlexSliderWidgetPart part, string displayType, dynamic shapeHelper)
        {
            var items = _contentManager.Query<FlexSliderPart, FlexSliderPartRecord>("FlexSlider")
                                       .Where(i => i.GroupId == part.GroupId).OrderBy(i => i.Sort)
                                       .List()
                                       .Select(i => new FlexSliderWidgetViewModel()
             {
                 ImagePath = ((MediaLibraryPickerField)i.Fields.Single(f => f.Name == "Picture"))
                                                        .MediaParts
                                                        .FirstOrDefault() == null ? "" : ((MediaLibraryPickerField)i.Fields.Single(f => f.Name == "Picture")).MediaParts.First().MediaUrl,
                 Title = i.Get<TitlePart>().Title

             });

            return ContentShape("Parts_FlexSliderWidget",
                () => shapeHelper.Parts_FlexSliderWidget(SlideItems: items));
        }

我快速查看了代码,您将无法按照模块当前的工作方式访问这些字段。基本上它是访问 drivers 显示方法中的内容项,然后使用它认为有必要发送到视图的两位数据(标题和图像)创建视图模型。我建议更改 drivers Display 方法以发回整个内容项而不是那个视图模型,然后您可以直接从视图访问您附加的字段。

如果您无权访问 driver,我想您可以在您的视图中获取内容管理器并重做 driver 正在执行的所有工作,以便您可以访问内容项.不过我不推荐这种方法...

抱歉,这可能不是您想要的答案。

编辑

这基本上是伪代码,因为我无法访问该模块以实际查看它是否有效,但它应该为您指明某种方向。

protected override DriverResult Display(FlexSliderWidgetPart part, string displayType, dynamic shapeHelper)
{
    var items = _contentManager.Query<FlexSliderPart, FlexSliderPartRecord>("FlexSlider")
                               .Where(i => i.GroupId == part.GroupId).OrderBy(i => i.Sort)
                               .List();

    return ContentShape("Parts_FlexSliderWidget",
        () => shapeHelper.Parts_FlexSliderWidget(SlideItems: items));
}

那么在你看来:

@using Tekno.FlexSlider.ViewModels

@{
    Style.Require("FlexSlider");
    Script.Require("FlexSlider");

}
<div class="flexslider">
    <ul class="slides">
        @foreach (var part in Model.SlideItems)
        {
            dynamic item = part.ContentItem;

            <li>
                <a href="@item.FlexSliderPart.SlideLink.Value"><img src="@Display.ResizeMediaUrl(Path: item.FlexSliderPart.MediaParts[0].MediaUrl, Height: 400, Mode: "crop")" /></a>
                <span class="slide-text">@item.TitlePart.Title</span>
            </li>
        }
    </ul>
    <span class="slide-text-bottom"></span>
</div>

这里重要的是将内容项转换为动态,这样您就可以访问所有字段等。我也从未使用过 1.8 中的新媒体内容,所以...不知道我是否正确访问它。我不喜欢^^