diff --git a/src/Orchard.Web/Modules/Orchard.ContentTypes/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.ContentTypes/Controllers/AdminController.cs index f8f14580f..defebd540 100644 --- a/src/Orchard.Web/Modules/Orchard.ContentTypes/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.ContentTypes/Controllers/AdminController.cs @@ -284,11 +284,14 @@ namespace Orchard.ContentTypes.Controllers { if (typeViewModel == null) return HttpNotFound(); + var typePartNames = new HashSet(typeViewModel.Parts.Select(tvm => tvm.PartDefinition.Name)); + var viewModel = new AddPartsViewModel { Type = typeViewModel, PartSelections = _contentDefinitionService.GetParts(false/*metadataPartsOnly*/) - .Where(cpd => !typeViewModel.Parts.Any(p => p.PartDefinition.Name == cpd.Name) && cpd.Settings.GetModel().Attachable) - .Select(cpd => new PartSelectionViewModel { PartName = cpd.Name, PartDisplayName = cpd.DisplayName, PartDescription = cpd.Description}) + .Where(cpd => !typePartNames.Contains(cpd.Name) && cpd.Settings.GetModel().Attachable) + .Select(cpd => new PartSelectionViewModel { PartName = cpd.Name, PartDisplayName = cpd.DisplayName, PartDescription = cpd.Description }) + .ToList() }; return View(viewModel); diff --git a/src/Orchard.Web/Modules/Orchard.ContentTypes/Services/ContentDefinitionService.cs b/src/Orchard.Web/Modules/Orchard.ContentTypes/Services/ContentDefinitionService.cs index 8db21adb0..9e3052c1a 100644 --- a/src/Orchard.Web/Modules/Orchard.ContentTypes/Services/ContentDefinitionService.cs +++ b/src/Orchard.Web/Modules/Orchard.ContentTypes/Services/ContentDefinitionService.cs @@ -180,22 +180,30 @@ namespace Orchard.ContentTypes.Services { } public IEnumerable GetParts(bool metadataPartsOnly) { - var typeNames = GetTypes().Select(ctd => ctd.Name); + var typeNames = new HashSet(GetTypes().Select(ctd => ctd.Name)); // user-defined parts // except for those parts with the same name as a type (implicit type's part or a mistake) - var userContentParts = _contentDefinitionManager - .ListPartDefinitions() + var userContentParts = _contentDefinitionManager.ListPartDefinitions() .Where(cpd => !typeNames.Contains(cpd.Name)) - .Select(cpd => new EditPartViewModel(cpd)); + .Select(cpd => new EditPartViewModel(cpd)) + .ToDictionary( + k => k.Name, + v => v); // code-defined parts - var codeDefinedParts = metadataPartsOnly ? - Enumerable.Empty() : - _contentPartDrivers.SelectMany(d => d.GetPartInfo().Where(cpd => !userContentParts.Any(m => m.Name == cpd.PartName)).Select(cpi => new EditPartViewModel { Name = cpi.PartName })); + var codeDefinedParts = metadataPartsOnly + ? Enumerable.Empty() + : _contentPartDrivers + .SelectMany(d => d.GetPartInfo() + .Where(cpd => !userContentParts.ContainsKey(cpd.PartName)) + .Select(cpi => new EditPartViewModel { Name = cpi.PartName, DisplayName = cpi.PartName })) + .ToList(); // Order by display name - return userContentParts.Union(codeDefinedParts).OrderBy(m => m.DisplayName); + return codeDefinedParts + .Union(userContentParts.Values) + .OrderBy(m => m.DisplayName); } public EditPartViewModel GetPart(string name) {