0

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

在此处输入图像描述

现在,这一切都很好。但我完全不知道如何在前端引用这个新字段。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));
        }
4

1 回答 1

1

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

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

这可能不是您希望的答案,对不起。

编辑

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

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

于 2015-02-25T10:12:23.997 回答