如何从Orchard CMS中的已分配contentpart获取值

时间:2015-02-25 09:13:47

标签: orchardcms flexslider orchardcms-1.8 orchard-modules

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

enter image description here

现在,这一切都很整洁。但我完全不知道如何在前端引用这个新领域。 FlexSliderWidgetViewModel仅包含Title和ImagePath的字段。我不知道如何检索SlideLink(和SubTitle)字段:

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>

驱动程序的显示功能:

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));
        }

1 个答案:

答案 0 :(得分:1)

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

如果您无法访问驱动程序,我可以在视图中抓取内容管理器并重做驱动程序正在执行的所有工作,以便您可以访问内容项。我不建议采用这种方法......

这可能不是你所希望的答案,抱歉。

修改

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

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中的新媒体内容所以...不知道我是否正在访问正确。我不喜欢它^^