在Orchard摘要视图中,我显示的内容项可能是Page,Blog Post或Projection。
我已将Media Picker字段附加到所有这些类型,并将其称为Picture。
我目前正在使用这段可怕的代码从内容项中访问媒体选择器:
if (contentItem != null)
{
try
{
mediaPicker = (MediaLibraryPickerField) contentItem.Blog.Picture;
}
catch (Exception e) {}
if (mediaPicker == null)
{
try
{
mediaPicker = (MediaLibraryPickerField)
contentItem.Page.Picture;
}
catch (Exception e) {}
}
if(mediaPicker == null)
{
try
{
mediaPicker = (MediaLibraryPickerField) contentItem.ProjectionPage.Picture;
}
catch (Exception e) {}
}
}
必须有更好的方法吗?
答案 0 :(得分:5)
另一种方法是使用Linq:
var mediaPicker = (MediaLibraryPickerField)
(from part in ((ContentItem)contentItem).Parts
from field in part.Fields
where field.Name == "Picture"
select field).FirstOrDefault();
它很干净,适用于具有Picture字段的未来新类型。
这是流利的等效词:
var mediaPicker = (MediaLibraryPickerField)
((IEnumerable<ContentPart>)contentItem.Parts)
.SelectMany(p => p.Fields)
.FirstOrDefault(f => f.Name == "Picture");
答案 1 :(得分:2)
您可以将项目转换为动态并像访问模板一样访问字段
dynamic content = (dynamic)contentItem;
var mediaPicker = content.BlogPart.Picture;
现在你在mediaPicker上有了这个字段。一个缺点是你失去了IntelliSense。如果该字段不存在,我认为mediaPicker为空。