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