Orchardcms 从不同的地方获得果园
在Orchard摘要视图中,我显示的内容项可以是页面、博客帖子或投影 我在所有这些类型上都附加了一个媒体选择器字段,称之为Picture 我目前正在使用这段可怕的代码从内容项访问媒体选择器:Orchardcms 从不同的地方获得果园,orchardcms,Orchardcms,在Orchard摘要视图中,我显示的内容项可以是页面、博客帖子或投影 我在所有这些类型上都附加了一个媒体选择器字段,称之为Picture 我目前正在使用这段可怕的代码从内容项访问媒体选择器: if (contentItem != null) { try { mediaPicker = (MediaLibraryPickerField) contentItem.Blog.Picture; } catch (Exception e) {} i
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) {}
}
}
一定有更好的方法吗?您可以将项目强制转换为动态,并像在模板上一样访问字段
dynamic content = (dynamic)contentItem;
var mediaPicker = content.BlogPart.Picture;
现在您有了mediaPicker上的字段。一个缺点是你失去了理智。如果该字段不存在,我认为mediaPicker为空。另一种方法是使用Linq:
var mediaPicker = (MediaLibraryPickerField)
(from part in ((ContentItem)contentItem).Parts
from field in part.Fields
where field.Name == "Picture"
select field).FirstOrDefault();
它很干净,适用于将来有图片字段的新类型
下面是流畅的等式:
var mediaPicker = (MediaLibraryPickerField)
((IEnumerable<ContentPart>)contentItem.Parts)
.SelectMany(p => p.Fields)
.FirstOrDefault(f => f.Name == "Picture");
var mediaPicker=(MediaLibraryPickerField)
((IEnumerable)contentItem.Parts)
.SelectMany(p=>p.Fields)
.FirstOrDefault(f=>f.Name==“图片”);
我想没有^真的吗?家伙!当我看到它的时候,我觉得很明显,这让我觉得自己很愚蠢。代码还不错。是否需要直接访问选择器字段?或者您可以使用位置来显示它吗?或者,您可以将字段附加到零件,然后从零件驱动程序访问数据并将其发送到显示器。每次我需要添加新的contentItem类型时,这些行代码中的某些内容都会变得更糟。我可以将内容项传递给@Display(contentItem),但我必须向它的alternates集合中添加一些内容,以便对其进行模板化。这只有在它是博客时才有效。页面和投影呢?我认为content.ProjectionPart.Picture和content.PagePart.Picture应该可以工作。它们可以工作,但如果它们不存在,就会抛出错误。因此,我所有的尝试都是骗局。同样的问题。也许你可以在开始的时候检查内容类型,这样你就可以避免尝试捕获。我想我输入了一个错误并更新了我的答案。请再试一次。您的打字错误更正修复了它。我刚刚在MediaLibraryPickerField中添加了一个类型转换,这是我的代码中所必需的,所以它的其余部分可以正常工作。我还添加了fluent,因为我更喜欢它。我补充了你的答案。希望没问题,酷!是的,我觉得很好。