2012-12-07 42 views
1

爲什麼無字段的ContentPart不包含在ContentItem中?爲什麼ContentPart不在ContentItem中?

這裏是代碼Migrations.cs:

SchemaBuilder.CreateTable("ImageDescribedPartRecord", 
       table => table.ContentPartRecord()); 

ContentDefinitionManager.AlterPartDefinition(
       "ImageDescribedPart", 
       cpd => cpd.WithField(
        "Image", 
        b => b 
          .OfType("MediaPickerField") 
          .WithSetting("MediaPickerFieldSettings.Required", "false"))); 

ContentDefinitionManager.AlterTypeDefinition(
       "PlantPicture", 
       cfg => cfg 
          .WithPart("ImageDescribedPart") 
          .WithPart("CommonPart", p => p.WithSetting("OwnerEditorSettings.ShowOwnerEditor", "false")) 
          .WithPart("BodyPart") 
          .WithPart("TitlePart") 
          .WithPart("AutoroutePart" 
            , builder => 
             builder 
              .WithSetting("AutorouteSettings.AllowCustomPattern", "false") 
              .WithSetting("AutorouteSettings.AutomaticAdjustmentOnEdit", "true") 
              .WithSetting("AutorouteSettings.PatternDefinitions", "[{Name:'Container', Pattern: '{Content.Container.Path}/images/{Content.Slug}', Description: 'apgii/taxon/sub-taxon/images/title'}]") 
              .WithSetting("AutorouteSettings.DefaultPatternIndex", "0")) 
          .WithPart("ContainablePart") 
          .Creatable(true) 
        // todo: The following doesn't work. Make it work. 
          .WithSetting("BodyPartSettings.FlavorDefault", "text") 
          ); 

這裏是爲ContentPart代碼:

public class ImageDescribedPart : ContentPart<ImageDescribedPartRecord>{ 

    } 

public class ImageDescribedPartRecord :ContentPartRecord {} 

從駕駛員

IContentQuery<ContentItem> query = _contentManager 
    .Query(VersionOptions.Published) 
    .Join<CommonPartRecord>() 
    .Where(cr => cr.Container.Id == container.Id); 
var items = query.Slice(0, 10).ToList(); 

IEnumerable<Zulatm.WebPlants.Models.ImageDescribedPart> firstImages = items.AsPart<ImageDescribedPart>(); 

Logger.Debug("Items count: {0}", items.Count()); 
for (int i = 0; i < items.Count(); i++) { 
    Logger.Debug("Item {0}: {1}", i, items[i].As<TitlePart>().Title); 

} 
Logger.Debug("Images count: {0}",firstImages.Count()); 

下面的代碼返回以下

2012-12-07 16:28:45,616 [35] TaxonomyNodePartDriver - Items count: 2 
2012-12-07 16:28:45,617 [35] TaxonomyNodePartDriver - Item 0: Test 
2012-12-07 16:28:45,619 [35] TaxonomyNodePartDriver - Item 1: test img 2 
2012-12-07 16:28:45,619 [35] TaxonomyNodePartDriver - Images count: 0 

回答

1

您將項目「投」到一個零件並將其作爲一個IEnumerable存儲。我想知道這不會導致編譯錯誤,因爲這是錯誤的。

問題的根源很可能在於,如果您計劃直接通過「鑄造」使用零件,零件應該有相應的驅動程序(可以爲空)。

+1

這對於投射到零件是有效的。查看方法ContentExtension.AsPart (此IEnumerable 項目)。另外一部分不需要驅動程序來查詢它。它需要一個正確的過濾器。請參閱下面的答案。 – Artyom

+0

你是對的,我已經監督那個項目是複數那裏。我對這種混亂表示抱歉。 但是我對你的問題的答案仍然是正確的:我已經談到了「鑄造」(As <>()方法),是的,如果你像你一樣附加遷移部分,你確實需要一個驅動程序已經呈現。因此,即使您找到了其他解決方案,我的答案也是正確的。我不明白你爲什麼投票棄權。 – Piedone

+0

@Piedone是對的 - 最初你只是在遷移中描述過的部分。在這種情況下,這個答案完全沒問題 - 有一位司機失蹤了。你採取了一種不同的方法,好吧,但這不是降低有效答案的理由。另外,請記住,使用「ActivatingFilter」時,您將無法從管理界面刪除該部分。 –

1

好的。問題是在Handler中沒有添加Filter。已添加ActivatorFilter:

public ImageDescribedHandler (IRepository<ImageDescribedPartRecord> repository,  INavigationManager navigationManager) 
{ 
    Filters.Add(new ActivatingFilter<ImageDescribedPart>("PlantPicture")); 
} 

還刪除了用於創建表的行。