protected override DriverResult Editor(FeedSyncProfilePart part, dynamic shapeHelper) { return(Combined( ContentShape( "Parts_FeedSyncProfile_ContentType_Edit", () => { var compatibleContentTypes = GetTypesWithFeedSyncProfileItemPart() .Select(item => new SelectListItem { Text = item, Value = item, Selected = item == part.ContentType }); return shapeHelper.EditorTemplate( TemplateName: "Parts.FeedSyncProfile.ContentType", Model: new FeedSyncProfilePartContentTypeEditorViewModel { FeedSyncProfilePart = part, CompatibleContentTypes = compatibleContentTypes }, Prefix: Prefix); }), ContentShape( "Parts_FeedSyncProfile_NumberOfItemsToSyncDuringInit_Edit", () => { return shapeHelper.EditorTemplate( TemplateName: "Parts.FeedSyncProfile.NumberOfItemsToSyncDuringInit", Model: part, Prefix: Prefix); }), ContentShape( "Parts_FeedSyncProfile_FeedUrl_Edit", () => { return shapeHelper.EditorTemplate( TemplateName: "Parts.FeedSyncProfile.FeedUrl", Model: part, Prefix: Prefix); }), ContentShape( "Parts_FeedSyncProfile_Repopulate_Edit", () => { return shapeHelper.EditorTemplate( TemplateName: "Parts.FeedSyncProfile.Repopulate", Model: part, Prefix: Prefix); }), ContentShape( "Parts_FeedSyncProfile_Mappings_Edit", () => { var compatibleContentItemStorageNames = _feedManager .GetCompatibleContentItemStorageNames(part.ContentType); // Setting the smart defaults. if (!part.Mappings.Any()) { if (compatibleContentItemStorageNames.Contains("TitlePart")) { part.Mappings.Add(new Mapping { FeedMapping = "title", ContentItemStorageMapping = "TitlePart" }); } if (compatibleContentItemStorageNames.Contains("BodyPart")) { part.Mappings.Add(new Mapping { FeedMapping = "description", ContentItemStorageMapping = "BodyPart" }); } if (part.FeedType == "Rss") { if (compatibleContentItemStorageNames.Contains("CommonPart.CreatedUtc")) { part.Mappings.Add(new Mapping { FeedMapping = "pubDate", ContentItemStorageMapping = "CommonPart.CreatedUtc" }); } } } // If a mapping data storage is no longer available or the feed node field is empty, // then delete it from the mappings. part .Mappings .RemoveAll(mapping => !compatibleContentItemStorageNames.Contains(mapping.ContentItemStorageMapping) || string.IsNullOrEmpty(mapping.FeedMapping)); var mappingViewModel = new List <MappingViewModel>(); var contentItemStorageMappings = part .Mappings .Select(mapping => mapping.ContentItemStorageMapping); // Adding as many empty fields as many can be created. foreach (var compatibleContentItemStorageName in compatibleContentItemStorageNames) { if (!contentItemStorageMappings.Contains(compatibleContentItemStorageName)) { part .Mappings .Add( new Mapping { ContentItemStorageMapping = "", FeedMapping = "" }); } } // Constructing data sources for the dropdowns. foreach (var mapping in part.Mappings) { var selectList = new List <SelectListItem>(); selectList.Add( new SelectListItem { Text = T("Select an Option Below").Text, Value = "", Selected = string.IsNullOrEmpty(mapping.ContentItemStorageMapping) }); selectList .AddRange( compatibleContentItemStorageNames .Select(item => new SelectListItem { Text = item, Value = item, Selected = item == mapping.ContentItemStorageMapping })); mappingViewModel.Add( new MappingViewModel { FeedMapping = mapping.FeedMapping, ContentItemStorageMappingSelectList = selectList }); } return shapeHelper.EditorTemplate( TemplateName: "Parts.FeedSyncProfile.Mappings", Model: new FeedSyncProfilePartMappingsEditorViewModel { FeedSyncProfilePart = part, MappingViewModel = mappingViewModel }, Prefix: Prefix); }))); }