diff --git a/src/OrchardCore.Modules/OrchardCore.Menu/Drivers/MenuPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Menu/Drivers/MenuPartDisplayDriver.cs index 30b74a72591..5b2b512e18a 100644 --- a/src/OrchardCore.Modules/OrchardCore.Menu/Drivers/MenuPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Menu/Drivers/MenuPartDisplayDriver.cs @@ -20,28 +20,32 @@ namespace OrchardCore.Menu.Drivers public class MenuPartDisplayDriver : ContentPartDisplayDriver { private readonly IContentDefinitionManager _contentDefinitionManager; - protected readonly IHtmlLocalizer H; private readonly INotifier _notifier; private readonly ILogger _logger; + protected readonly IHtmlLocalizer H; + public MenuPartDisplayDriver( IContentDefinitionManager contentDefinitionManager, - IHtmlLocalizer htmlLocalizer, INotifier notifier, - ILogger logger + ILogger logger, + IHtmlLocalizer htmlLocalizer ) { _contentDefinitionManager = contentDefinitionManager; - H = htmlLocalizer; _notifier = notifier; _logger = logger; + H = htmlLocalizer; } public override IDisplayResult Edit(MenuPart part) { return Initialize("MenuPart_Edit", async model => { - var menuItemContentTypes = (await _contentDefinitionManager.ListTypeDefinitionsAsync()).Where(t => t.StereotypeEquals("MenuItem")); + var menuItemContentTypes = (await _contentDefinitionManager.ListTypeDefinitionsAsync()) + .Where(t => t.StereotypeEquals("MenuItem")) + .ToArray(); + var notify = false; foreach (var menuItem in part.ContentItem.As().MenuItems) @@ -68,20 +72,27 @@ public override async Task UpdateAsync(MenuPart part, IUpdateMod { var model = new MenuPartEditViewModel(); - if (await updater.TryUpdateModelAsync(model, Prefix, t => t.Hierarchy) && !string.IsNullOrWhiteSpace(model.Hierarchy)) + if (await updater.TryUpdateModelAsync(model, Prefix, t => t.Hierarchy) && + !string.IsNullOrWhiteSpace(model.Hierarchy)) { - var originalMenuItems = part.ContentItem.As(); - - var newHierarchy = JArray.Parse(model.Hierarchy); - var menuItems = new JsonArray(); - foreach (var item in newHierarchy) + var originalMenuItems = part.ContentItem.As(); + + if (originalMenuItems is not null) { - menuItems.Add(ProcessItem(originalMenuItems, item as JsonObject)); + var newHierarchy = JArray.Parse(model.Hierarchy); + + foreach (var item in newHierarchy) + { + menuItems.Add(ProcessItem(originalMenuItems, item as JsonObject)); + } } - part.ContentItem.Content["MenuItemsListPart"] = new JsonObject { ["MenuItems"] = menuItems }; + part.ContentItem.Content[nameof(MenuItemsListPart)] = new JsonObject + { + [nameof(MenuItemsListPart.MenuItems)] = menuItems, + }; } return Edit(part); @@ -101,9 +112,13 @@ private static JsonObject GetMenuItemAt(MenuItemsListPart menuItems, int[] index } var newObj = JObject.FromObject(menuItem, JOptions.Default); - if (newObj["MenuItemsListPart"] != null) + + if (newObj[nameof(MenuItemsListPart)] != null) { - newObj["MenuItemsListPart"] = new JsonObject { ["MenuItems"] = new JsonArray() }; + newObj[nameof(MenuItemsListPart)] = new JsonObject + { + [nameof(MenuItemsListPart.MenuItems)] = new JsonArray() + }; } return newObj; @@ -111,17 +126,24 @@ private static JsonObject GetMenuItemAt(MenuItemsListPart menuItems, int[] index private static JsonObject ProcessItem(MenuItemsListPart originalItems, JsonObject item) { - var contentItem = GetMenuItemAt(originalItems, item["index"].ToString().Split('-').Select(x => Convert.ToInt32(x)).ToArray()); + var indexes = item["index"]?.ToString().Split('-').Select(x => Convert.ToInt32(x)).ToArray() ?? []; + + var contentItem = GetMenuItemAt(originalItems, indexes); var children = item["children"] as JsonArray; if (children is not null) { var menuItems = new JsonArray(); + for (var i = 0; i < children.Count; i++) { menuItems.Add(ProcessItem(originalItems, children[i] as JsonObject)); - contentItem["MenuItemsListPart"] = new JsonObject { ["MenuItems"] = menuItems }; + } + + contentItem[nameof(MenuItemsListPart)] = new JsonObject + { + [nameof(MenuItemsListPart.MenuItems)] = menuItems, }; }