From 80515cbda38bb7e3ddb90f42ce5943926fb92870 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Sun, 12 May 2019 00:53:08 -0400 Subject: [PATCH 01/24] add "and create new" option on save draft and publish buttons --- .../Controllers/AdminController.cs | 38 +++++++++++++------ .../Views/Content.PublishButton.cshtml | 25 +++++------- .../Views/Content.SaveDraftButton.cshtml | 24 +++++------- .../Views/Template/Create.cshtml | 1 + .../Views/Template/Edit.cshtml | 1 + 5 files changed, 48 insertions(+), 41 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs index b8a03c783e2..191ca588fcc 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs @@ -82,7 +82,7 @@ public async Task List(ListContentsViewModel model, PagerParamete { query = query.With(x => x.DisplayText.Contains(model.DisplayText)); } - + switch (model.Options.ContentsStatus) { case ContentsStatus.Published: @@ -170,7 +170,7 @@ public async Task List(ListContentsViewModel model, PagerParamete var routeData = new RouteData(); routeData.Values.Add("DisplayText", model.DisplayText); - + var pagerShape = (await New.Pager(pager)).TotalItemCount(maxPagedCount > 0 ? maxPagedCount : await query.CountAsync()).RouteData(routeData); var pageOfContentItems = await query.Skip(pager.GetStartIndex()).Take(pager.PageSize).ListAsync(); @@ -338,7 +338,9 @@ public async Task Create(string id) public Task CreatePOST(string id, [Bind(Prefix = "submit.Save")] string submitSave, string returnUrl) { var stayOnSamePage = submitSave == "submit.SaveAndContinue"; - return CreatePOST(id, returnUrl, stayOnSamePage, contentItem => + var createNewAfterCreate = submitSave == "submit.SaveAndCreateNew"; + + return CreatePOST(id, returnUrl, stayOnSamePage, createNewAfterCreate, contentItem => { var typeDefinition = _contentDefinitionManager.GetTypeDefinition(contentItem.ContentType); @@ -355,6 +357,8 @@ public Task CreatePOST(string id, [Bind(Prefix = "submit.Save")] public async Task CreateAndPublishPOST(string id, [Bind(Prefix = "submit.Publish")] string submitPublish, string returnUrl) { var stayOnSamePage = submitPublish == "submit.PublishAndContinue"; + var createNewAfterCreate = submitPublish == "submit.PublishAndCreateNew"; + // pass a dummy content to the authorization check to check for "own" variations var dummyContent = await _contentManager.NewAsync(id); @@ -364,7 +368,7 @@ public async Task CreateAndPublishPOST(string id, [Bind(Prefix = return Unauthorized(); } - return await CreatePOST(id, returnUrl, stayOnSamePage, async contentItem => + return await CreatePOST(id, returnUrl, stayOnSamePage, createNewAfterCreate, async contentItem => { await _contentManager.PublishAsync(contentItem); @@ -376,7 +380,7 @@ public async Task CreateAndPublishPOST(string id, [Bind(Prefix = }); } - private async Task CreatePOST(string id, string returnUrl, bool stayOnSamePage, Func conditionallyPublish) + private async Task CreatePOST(string id, string returnUrl, bool stayOnSamePage, bool createNewAfterCreate, Func conditionallyPublish) { var contentItem = await _contentManager.NewAsync(id); @@ -400,11 +404,16 @@ private async Task CreatePOST(string id, string returnUrl, bool s await conditionallyPublish(contentItem); - if ((!string.IsNullOrEmpty(returnUrl)) && (!stayOnSamePage)) + if ((!string.IsNullOrEmpty(returnUrl)) && (!stayOnSamePage || !createNewAfterCreate)) { return LocalRedirect(returnUrl); } + if (createNewAfterCreate) + { + return RedirectToAction("Create", new RouteValueDictionary { { "id", id }, { "returnUrl", returnUrl } }); + } + var adminRouteValues = (await _contentManager.PopulateAspectAsync(contentItem)).AdminRouteValues; if (!string.IsNullOrEmpty(returnUrl)) @@ -456,7 +465,9 @@ public async Task Edit(string contentItemId) public Task EditPOST(string contentItemId, [Bind(Prefix = "submit.Save")] string submitSave, string returnUrl) { var stayOnSamePage = submitSave == "submit.SaveAndContinue"; - return EditPOST(contentItemId, returnUrl, stayOnSamePage, contentItem => + var createNewAfterEdit = submitSave == "submit.SaveAndCreateNew"; + + return EditPOST(contentItemId, returnUrl, stayOnSamePage, createNewAfterEdit, contentItem => { var typeDefinition = _contentDefinitionManager.GetTypeDefinition(contentItem.ContentType); @@ -470,9 +481,10 @@ public Task EditPOST(string contentItemId, [Bind(Prefix = "submit [HttpPost, ActionName("Edit")] [FormValueRequired("submit.Publish")] - public async Task EditAndPublishPOST(string contentItemId, [Bind(Prefix ="submit.Publish")] string submitPublish, string returnUrl) + public async Task EditAndPublishPOST(string contentItemId, [Bind(Prefix = "submit.Publish")] string submitPublish, string returnUrl) { var stayOnSamePage = submitPublish == "submit.PublishAndContinue"; + var createNewAfterEdit = submitPublish == "submit.PublishAndCreateNew"; var content = await _contentManager.GetAsync(contentItemId, VersionOptions.Latest); @@ -485,7 +497,7 @@ public async Task EditAndPublishPOST(string contentItemId, [Bind( { return Unauthorized(); } - return await EditPOST(contentItemId, returnUrl, stayOnSamePage, async contentItem => + return await EditPOST(contentItemId, returnUrl, stayOnSamePage, createNewAfterEdit, async contentItem => { await _contentManager.PublishAsync(contentItem); @@ -497,7 +509,7 @@ public async Task EditAndPublishPOST(string contentItemId, [Bind( }); } - private async Task EditPOST(string contentItemId, string returnUrl, bool stayOnSamePage, Func conditionallyPublish) + private async Task EditPOST(string contentItemId, string returnUrl, bool stayOnSamePage, bool createNewAfterEdit, Func conditionallyPublish) { var contentItem = await _contentManager.GetAsync(contentItemId, VersionOptions.DraftRequired); @@ -533,7 +545,7 @@ private async Task EditPOST(string contentItemId, string returnUr // executed some query which would flush the saved entities inside the above UpdateEditorAsync. _session.Save(contentItem); - await conditionallyPublish(contentItem); + await conditionallyPublish(contentItem); if (returnUrl == null) { @@ -543,6 +555,10 @@ private async Task EditPOST(string contentItemId, string returnUr { return RedirectToAction("Edit", new RouteValueDictionary { { "ContentItemId", contentItem.ContentItemId }, { "returnUrl", returnUrl } }); } + else if (createNewAfterEdit) + { + return RedirectToAction("Create", new RouteValueDictionary { { "id", contentItem.ContentType }, { "returnUrl", returnUrl } }); + } else { return LocalRedirect(returnUrl); diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml index 4c3a8091ee4..abc875f02a8 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml @@ -2,22 +2,17 @@ @{ var returnUrl = Context.Request.Query["returnUrl"]; } -@if (String.IsNullOrWhiteSpace(returnUrl)) -{ - -} -else -{ -
- - - + +
+ + + -} +
@* } *@ diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml index fb47beffc6e..0a122af6fe2 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml @@ -1,19 +1,13 @@ @{ var returnUrl = Context.Request.Query["returnUrl"]; } -@if (String.IsNullOrWhiteSpace(returnUrl)) -{ - -} -else -{ -
- - - +
+ + + -} \ No newline at end of file +
\ No newline at end of file diff --git a/src/OrchardCore.Modules/OrchardCore.Templates/Views/Template/Create.cshtml b/src/OrchardCore.Modules/OrchardCore.Templates/Views/Template/Create.cshtml index b51c21ac679..b158228110d 100644 --- a/src/OrchardCore.Modules/OrchardCore.Templates/Views/Template/Create.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Templates/Views/Template/Create.cshtml @@ -45,6 +45,7 @@
diff --git a/src/OrchardCore.Modules/OrchardCore.Templates/Views/Template/Edit.cshtml b/src/OrchardCore.Modules/OrchardCore.Templates/Views/Template/Edit.cshtml index b5e0e969bda..00481e56ea3 100644 --- a/src/OrchardCore.Modules/OrchardCore.Templates/Views/Template/Edit.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Templates/Views/Template/Edit.cshtml @@ -48,6 +48,7 @@
From c969e5576ce75d1f36c8775b671ee11d5c62434c Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Sun, 12 May 2019 01:18:24 -0400 Subject: [PATCH 02/24] code cleanup --- .../Controllers/AdminController.cs | 28 +++++++++---------- .../Views/Content.PublishButton.cshtml | 7 ----- .../Views/Content.SaveDraftButton.cshtml | 3 -- .../Views/Template/Create.cshtml | 6 ++-- .../Views/Template/Edit.cshtml | 2 +- 5 files changed, 18 insertions(+), 28 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs index 191ca588fcc..49d690eaa6a 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs @@ -78,7 +78,7 @@ public async Task List(ListContentsViewModel model, PagerParamete var query = _session.Query(); - if (!string.IsNullOrEmpty(model.DisplayText)) + if (!String.IsNullOrEmpty(model.DisplayText)) { query = query.With(x => x.DisplayText.Contains(model.DisplayText)); } @@ -104,7 +104,7 @@ public async Task List(ListContentsViewModel model, PagerParamete model.Id = typeId; } - if (!string.IsNullOrEmpty(model.TypeName)) + if (!String.IsNullOrEmpty(model.TypeName)) { var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(model.TypeName); if (contentTypeDefinition == null) @@ -234,7 +234,7 @@ private async Task> GetListableTypesAsync() // routeValues["Options.SelectedCulture"] = options.SelectedCulture; //todo: don't hard-code the key // routeValues["Options.OrderBy"] = options.OrderBy; //todo: don't hard-code the key // routeValues["Options.ContentsStatus"] = options.ContentsStatus; //todo: don't hard-code the key - // if (GetListableTypes(false).Any(ctd => string.Equals(ctd.Name, options.SelectedFilter, StringComparison.OrdinalIgnoreCase))) + // if (GetListableTypes(false).Any(ctd => String.Equals(ctd.Name, options.SelectedFilter, StringComparison.OrdinalIgnoreCase))) // { // routeValues["id"] = options.SelectedFilter; // } @@ -344,7 +344,7 @@ public Task CreatePOST(string id, [Bind(Prefix = "submit.Save")] { var typeDefinition = _contentDefinitionManager.GetTypeDefinition(contentItem.ContentType); - _notifier.Success(string.IsNullOrWhiteSpace(typeDefinition.DisplayName) + _notifier.Success(String.IsNullOrWhiteSpace(typeDefinition.DisplayName) ? T["Your content draft has been saved."] : T["Your {0} draft has been saved.", typeDefinition.DisplayName]); @@ -374,7 +374,7 @@ public async Task CreateAndPublishPOST(string id, [Bind(Prefix = var typeDefinition = _contentDefinitionManager.GetTypeDefinition(contentItem.ContentType); - _notifier.Success(string.IsNullOrWhiteSpace(typeDefinition.DisplayName) + _notifier.Success(String.IsNullOrWhiteSpace(typeDefinition.DisplayName) ? T["Your content has been published."] : T["Your {0} has been published.", typeDefinition.DisplayName]); }); @@ -404,7 +404,7 @@ private async Task CreatePOST(string id, string returnUrl, bool s await conditionallyPublish(contentItem); - if ((!string.IsNullOrEmpty(returnUrl)) && (!stayOnSamePage || !createNewAfterCreate)) + if ((!String.IsNullOrEmpty(returnUrl)) && (!stayOnSamePage || !createNewAfterCreate)) { return LocalRedirect(returnUrl); } @@ -416,7 +416,7 @@ private async Task CreatePOST(string id, string returnUrl, bool s var adminRouteValues = (await _contentManager.PopulateAspectAsync(contentItem)).AdminRouteValues; - if (!string.IsNullOrEmpty(returnUrl)) + if (!String.IsNullOrEmpty(returnUrl)) { adminRouteValues.Add("returnUrl", returnUrl); } @@ -471,7 +471,7 @@ public Task EditPOST(string contentItemId, [Bind(Prefix = "submit { var typeDefinition = _contentDefinitionManager.GetTypeDefinition(contentItem.ContentType); - _notifier.Success(string.IsNullOrWhiteSpace(typeDefinition.DisplayName) + _notifier.Success(String.IsNullOrWhiteSpace(typeDefinition.DisplayName) ? T["Your content draft has been saved."] : T["Your {0} draft has been saved.", typeDefinition.DisplayName]); @@ -503,7 +503,7 @@ public async Task EditAndPublishPOST(string contentItemId, [Bind( var typeDefinition = _contentDefinitionManager.GetTypeDefinition(contentItem.ContentType); - _notifier.Success(string.IsNullOrWhiteSpace(typeDefinition.DisplayName) + _notifier.Success(String.IsNullOrWhiteSpace(typeDefinition.DisplayName) ? T["Your content has been published."] : T["Your {0} has been published.", typeDefinition.DisplayName]); }); @@ -525,7 +525,7 @@ private async Task EditPOST(string contentItemId, string returnUr //string previousRoute = null; //if (contentItem.Has() && - // !string.IsNullOrWhiteSpace(returnUrl) + // !String.IsNullOrWhiteSpace(returnUrl) // && Request.IsLocalUrl(returnUrl) // // only if the original returnUrl is the content itself // && String.Equals(returnUrl, Url.ItemDisplayUrl(contentItem), StringComparison.OrdinalIgnoreCase) @@ -615,7 +615,7 @@ public async Task DiscardDraft(string contentItemId, string retur await _contentManager.DiscardDraftAsync(contentItem); - _notifier.Success(string.IsNullOrWhiteSpace(typeDefinition.DisplayName) + _notifier.Success(String.IsNullOrWhiteSpace(typeDefinition.DisplayName) ? T["The draft has been removed."] : T["The {0} draft has been removed.", typeDefinition.DisplayName]); } @@ -639,7 +639,7 @@ public async Task Remove(string contentItemId, string returnUrl) await _contentManager.RemoveAsync(contentItem); - _notifier.Success(string.IsNullOrWhiteSpace(typeDefinition.DisplayName) + _notifier.Success(String.IsNullOrWhiteSpace(typeDefinition.DisplayName) ? T["That content has been removed."] : T["That {0} has been removed.", typeDefinition.DisplayName]); } @@ -665,7 +665,7 @@ public async Task Publish(string contentItemId, string returnUrl) var typeDefinition = _contentDefinitionManager.GetTypeDefinition(contentItem.ContentType); - if (string.IsNullOrEmpty(typeDefinition.DisplayName)) + if (String.IsNullOrEmpty(typeDefinition.DisplayName)) { _notifier.Success(T["That content has been published."]); } @@ -695,7 +695,7 @@ public async Task Unpublish(string contentItemId, string returnUr var typeDefinition = _contentDefinitionManager.GetTypeDefinition(contentItem.ContentType); - if (string.IsNullOrEmpty(typeDefinition.DisplayName)) + if (String.IsNullOrEmpty(typeDefinition.DisplayName)) { _notifier.Success(T["The content has been unpublished."]); } diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml index abc875f02a8..7d0163df381 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml @@ -1,8 +1,3 @@ -@*@if (Authorizer.Authorize(Permissions.PublishContent, (IContent)Model.ContentItem)) {*@ -@{ - var returnUrl = Context.Request.Query["returnUrl"]; -} -
-@* } *@ - diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml index 0a122af6fe2..28248065f41 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml @@ -1,6 +1,3 @@ -@{ - var returnUrl = Context.Request.Query["returnUrl"]; -}
@if (Url.IsLocalUrl(returnUrl)) - { + { @T["Cancel"] } @T["Preview"] diff --git a/src/OrchardCore.Modules/OrchardCore.Templates/Views/Template/Edit.cshtml b/src/OrchardCore.Modules/OrchardCore.Templates/Views/Template/Edit.cshtml index 00481e56ea3..549f98581c5 100644 --- a/src/OrchardCore.Modules/OrchardCore.Templates/Views/Template/Edit.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Templates/Views/Template/Edit.cshtml @@ -55,7 +55,7 @@ @if (Url.IsLocalUrl(returnUrl)) { @T["Cancel"] - } + } @T["Preview"] From be885e2a8ab3b0e62ad1f68c2864b857f39a4620 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Mon, 13 May 2019 16:40:13 -0400 Subject: [PATCH 03/24] Add a returnUrl to the contents list for menu content items that are used for creating new content items. --- .../OrchardCore.Contents/AdminMenu.cs | 7 +++++ .../Controllers/AdminController.cs | 13 +++++--- .../Views/Content.PublishButton.cshtml | 31 +++++++++++++------ .../Views/Content.SaveDraftButton.cshtml | 28 +++++++++++------ 4 files changed, 56 insertions(+), 23 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs b/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs index a44c0d7d166..98bfd2dc054 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs @@ -1,6 +1,9 @@ using System; using System.Linq; using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Routing; +using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Localization; using OrchardCore.ContentManagement; using OrchardCore.ContentManagement.Metadata; @@ -55,6 +58,10 @@ public async Task BuildNavigationAsync(string name, NavigationBuilder builder) var ci = await _contentManager.NewAsync(contentTypeDefinition.Name); var cim = await _contentManager.PopulateAspectAsync(ci); var createRouteValues = cim.CreateRouteValues; + + //We add a returnUrl to the contents list for these menu items + createRouteValues.Add("returnUrl", "/Admin/Contents/ContentItems"); + if (createRouteValues.Any()) newMenu.Add(new LocalizedString(contentTypeDefinition.DisplayName, contentTypeDefinition.DisplayName), "5", item => item .Action(cim.CreateRouteValues["Action"] as string, cim.CreateRouteValues["Controller"] as string, cim.CreateRouteValues) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs index 49d690eaa6a..d4c39780639 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs @@ -404,14 +404,17 @@ private async Task CreatePOST(string id, string returnUrl, bool s await conditionallyPublish(contentItem); - if ((!String.IsNullOrEmpty(returnUrl)) && (!stayOnSamePage || !createNewAfterCreate)) - { - return LocalRedirect(returnUrl); - } - if (createNewAfterCreate) { return RedirectToAction("Create", new RouteValueDictionary { { "id", id }, { "returnUrl", returnUrl } }); + + } + else + { + if (!String.IsNullOrEmpty(returnUrl) && !stayOnSamePage) + { + return LocalRedirect(returnUrl); + } } var adminRouteValues = (await _contentManager.PopulateAspectAsync(contentItem)).AdminRouteValues; diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml index 7d0163df381..93245492fd4 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml @@ -1,11 +1,24 @@ -
- - - +} + +@* } *@ diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml index 28248065f41..004d93aa121 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml @@ -1,10 +1,20 @@ -
- - - \ No newline at end of file +} \ No newline at end of file From 8ca26ef71d482085447a106a16dfa3eb73aeb2f2 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Tue, 14 May 2019 02:59:18 -0400 Subject: [PATCH 04/24] Move add returnUrl to NavigationManager --- .../OrchardCore.Contents/AdminMenu.cs | 6 ----- .../NavigationManager.cs | 22 ++++++++++++++++++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs b/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs index 98bfd2dc054..baa0d7520de 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs @@ -1,9 +1,6 @@ using System; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Routing; -using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Localization; using OrchardCore.ContentManagement; using OrchardCore.ContentManagement.Metadata; @@ -59,9 +56,6 @@ public async Task BuildNavigationAsync(string name, NavigationBuilder builder) var cim = await _contentManager.PopulateAspectAsync(ci); var createRouteValues = cim.CreateRouteValues; - //We add a returnUrl to the contents list for these menu items - createRouteValues.Add("returnUrl", "/Admin/Contents/ContentItems"); - if (createRouteValues.Any()) newMenu.Add(new LocalizedString(contentTypeDefinition.DisplayName, contentTypeDefinition.DisplayName), "5", item => item .Action(cim.CreateRouteValues["Action"] as string, cim.CreateRouteValues["Controller"] as string, cim.CreateRouteValues) diff --git a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs index 13f96addcbe..ef78b1c707b 100644 --- a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs +++ b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; using OrchardCore.Environment.Shell; @@ -29,7 +30,8 @@ public class NavigationManager : INavigationManager ILogger logger, ShellSettings shellSettings, IUrlHelperFactory urlHelperFactory, - IAuthorizationService authorizationService + IAuthorizationService authorizationService, + IStringLocalizer localizer ) { _navigationProviders = navigationProviders; @@ -37,8 +39,11 @@ IAuthorizationService authorizationService _shellSettings = shellSettings; _urlHelperFactory = urlHelperFactory; _authorizationService = authorizationService; + T = localizer; } + public IStringLocalizer T { get; set; } + public async Task> BuildMenuAsync(string name, ActionContext actionContext) { var builder = new NavigationBuilder(); @@ -71,6 +76,21 @@ public async Task> BuildMenuAsync(string name, ActionConte // Keep only menu items with an Href, or that have child items with an Href menuItems = Reduce(menuItems); + // Add returnUrl to all create menu content items + var contentItemsMenu = menuItems?.Find(mi => mi.Text == T["Content"].Value)?.Items?.Find(mi => mi.Text == T["Content Items"].Value); + if (contentItemsMenu != null) + { + var createMenuItems = menuItems?.Find(mi => mi.Text == T["New"].Value)?.Items; + if (createMenuItems != null) + { + foreach (var menuItem in createMenuItems) + { + menuItem.Href = menuItem.Href + "?returnUrl=" + contentItemsMenu.Href; + menuItem.RouteValues.Add("returnUrl", contentItemsMenu.Href); + } + } + } + return menuItems; } From cf34ebf8a9b664e0309310784ac56321aae6ce33 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Tue, 14 May 2019 14:10:58 -0400 Subject: [PATCH 05/24] Implement NavigationItemBuilder ReturnUrl --- .../OrchardCore.Contents/AdminMenu.cs | 1 + .../OrchardCore.Navigation.Core/MenuItem.cs | 5 ++++ .../NavigationItemBuilder.cs | 13 ++++++++++ .../NavigationManager.cs | 25 +++++++------------ 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs b/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs index baa0d7520de..79fa191ab09 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs @@ -59,6 +59,7 @@ public async Task BuildNavigationAsync(string name, NavigationBuilder builder) if (createRouteValues.Any()) newMenu.Add(new LocalizedString(contentTypeDefinition.DisplayName, contentTypeDefinition.DisplayName), "5", item => item .Action(cim.CreateRouteValues["Action"] as string, cim.CreateRouteValues["Controller"] as string, cim.CreateRouteValues) + .ReturnUrl("List", "Admin", "OrchardCore.Contents") .Permission(ContentTypePermissions.CreateDynamicPermission(ContentTypePermissions.PermissionTemplates[Permissions.PublishOwnContent.Name], contentTypeDefinition)) ); } diff --git a/src/OrchardCore/OrchardCore.Navigation.Core/MenuItem.cs b/src/OrchardCore/OrchardCore.Navigation.Core/MenuItem.cs index b7849ebadc0..a129563ae25 100644 --- a/src/OrchardCore/OrchardCore.Navigation.Core/MenuItem.cs +++ b/src/OrchardCore/OrchardCore.Navigation.Core/MenuItem.cs @@ -80,6 +80,11 @@ public MenuItem() /// public RouteValueDictionary RouteValues { get; set; } + /// + /// The optional route values for this menu item Return Url. + /// + public RouteValueDictionary ReturnUrlRouteValues { get; set; } + /// /// The list of objects the user must have in order to see this menu item. /// diff --git a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationItemBuilder.cs b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationItemBuilder.cs index 4b9fd3b69ce..540d1e152d4 100644 --- a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationItemBuilder.cs +++ b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationItemBuilder.cs @@ -143,6 +143,19 @@ public NavigationItemBuilder Action(string actionName, string controllerName, st return Action(actionName, controllerName, areaName, new RouteValueDictionary()); } + public NavigationItemBuilder ReturnUrl(string actionName, string controllerName, string areaName) + { + _item.ReturnUrlRouteValues = new RouteValueDictionary(); + if (!string.IsNullOrEmpty(actionName)) + _item.ReturnUrlRouteValues["action"] = actionName; + if (!string.IsNullOrEmpty(controllerName)) + _item.ReturnUrlRouteValues["controller"] = controllerName; + if (!string.IsNullOrEmpty(areaName)) + _item.ReturnUrlRouteValues["area"] = areaName; + + return this; + } + public NavigationItemBuilder Action(string actionName, string controllerName, string areaName, RouteValueDictionary values) { _item.RouteValues = new RouteValueDictionary(values); diff --git a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs index ef78b1c707b..6916bbb5bfe 100644 --- a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs +++ b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs @@ -76,21 +76,6 @@ public async Task> BuildMenuAsync(string name, ActionConte // Keep only menu items with an Href, or that have child items with an Href menuItems = Reduce(menuItems); - // Add returnUrl to all create menu content items - var contentItemsMenu = menuItems?.Find(mi => mi.Text == T["Content"].Value)?.Items?.Find(mi => mi.Text == T["Content Items"].Value); - if (contentItemsMenu != null) - { - var createMenuItems = menuItems?.Find(mi => mi.Text == T["New"].Value)?.Items; - if (createMenuItems != null) - { - foreach (var menuItem in createMenuItems) - { - menuItem.Href = menuItem.Href + "?returnUrl=" + contentItemsMenu.Href; - menuItem.RouteValues.Add("returnUrl", contentItemsMenu.Href); - } - } - } - return menuItems; } @@ -184,7 +169,15 @@ private List ComputeHref(List menuItems, ActionContext actio { foreach (var menuItem in menuItems) { - menuItem.Href = GetUrl(menuItem.Url, menuItem.RouteValues, actionContext); + if (menuItem.ReturnUrlRouteValues != null) + { + var returnUrl = GetUrl(menuItem.Url, menuItem.ReturnUrlRouteValues, actionContext); + menuItem.Href = GetUrl(menuItem.Url, menuItem.RouteValues, actionContext) + "?returnUrl=" + returnUrl; + } + else { + menuItem.Href = GetUrl(menuItem.Url, menuItem.RouteValues, actionContext); + } + menuItem.Items = ComputeHref(menuItem.Items, actionContext); } From bc286e21727a4cdb3551c24dcfcbfcba599ce9f5 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 15 May 2019 02:51:29 -0400 Subject: [PATCH 06/24] simplify code --- .../Controllers/AdminController.cs | 36 ++++++++----------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs index d4c39780639..1b8a6a95fb7 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs @@ -337,10 +337,7 @@ public async Task Create(string id) [FormValueRequired("submit.Save")] public Task CreatePOST(string id, [Bind(Prefix = "submit.Save")] string submitSave, string returnUrl) { - var stayOnSamePage = submitSave == "submit.SaveAndContinue"; - var createNewAfterCreate = submitSave == "submit.SaveAndCreateNew"; - - return CreatePOST(id, returnUrl, stayOnSamePage, createNewAfterCreate, contentItem => + return CreatePOST(id, returnUrl, submitSave, contentItem => { var typeDefinition = _contentDefinitionManager.GetTypeDefinition(contentItem.ContentType); @@ -356,19 +353,15 @@ public Task CreatePOST(string id, [Bind(Prefix = "submit.Save")] [FormValueRequired("submit.Publish")] public async Task CreateAndPublishPOST(string id, [Bind(Prefix = "submit.Publish")] string submitPublish, string returnUrl) { - var stayOnSamePage = submitPublish == "submit.PublishAndContinue"; - var createNewAfterCreate = submitPublish == "submit.PublishAndCreateNew"; - // pass a dummy content to the authorization check to check for "own" variations var dummyContent = await _contentManager.NewAsync(id); - if (!await _authorizationService.AuthorizeAsync(User, Permissions.PublishContent, dummyContent)) { return Unauthorized(); } - return await CreatePOST(id, returnUrl, stayOnSamePage, createNewAfterCreate, async contentItem => + return await CreatePOST(id, returnUrl, submitPublish, async contentItem => { await _contentManager.PublishAsync(contentItem); @@ -380,8 +373,11 @@ public async Task CreateAndPublishPOST(string id, [Bind(Prefix = }); } - private async Task CreatePOST(string id, string returnUrl, bool stayOnSamePage, bool createNewAfterCreate, Func conditionallyPublish) + private async Task CreatePOST(string id, string returnUrl, string submit, Func conditionallyPublish) { + var stayOnSamePage = submit.Contains("Continue"); + var createNew = submit.Contains("CreateNew"); + var contentItem = await _contentManager.NewAsync(id); // Set the current user as the owner to check for ownership permissions on creation @@ -404,7 +400,7 @@ private async Task CreatePOST(string id, string returnUrl, bool s await conditionallyPublish(contentItem); - if (createNewAfterCreate) + if (createNew) { return RedirectToAction("Create", new RouteValueDictionary { { "id", id }, { "returnUrl", returnUrl } }); @@ -467,10 +463,7 @@ public async Task Edit(string contentItemId) [FormValueRequired("submit.Save")] public Task EditPOST(string contentItemId, [Bind(Prefix = "submit.Save")] string submitSave, string returnUrl) { - var stayOnSamePage = submitSave == "submit.SaveAndContinue"; - var createNewAfterEdit = submitSave == "submit.SaveAndCreateNew"; - - return EditPOST(contentItemId, returnUrl, stayOnSamePage, createNewAfterEdit, contentItem => + return EditPOST(contentItemId, returnUrl, submitSave, contentItem => { var typeDefinition = _contentDefinitionManager.GetTypeDefinition(contentItem.ContentType); @@ -486,9 +479,6 @@ public Task EditPOST(string contentItemId, [Bind(Prefix = "submit [FormValueRequired("submit.Publish")] public async Task EditAndPublishPOST(string contentItemId, [Bind(Prefix = "submit.Publish")] string submitPublish, string returnUrl) { - var stayOnSamePage = submitPublish == "submit.PublishAndContinue"; - var createNewAfterEdit = submitPublish == "submit.PublishAndCreateNew"; - var content = await _contentManager.GetAsync(contentItemId, VersionOptions.Latest); if (content == null) @@ -500,7 +490,8 @@ public async Task EditAndPublishPOST(string contentItemId, [Bind( { return Unauthorized(); } - return await EditPOST(contentItemId, returnUrl, stayOnSamePage, createNewAfterEdit, async contentItem => + + return await EditPOST(contentItemId, returnUrl, submitPublish, async contentItem => { await _contentManager.PublishAsync(contentItem); @@ -512,8 +503,11 @@ public async Task EditAndPublishPOST(string contentItemId, [Bind( }); } - private async Task EditPOST(string contentItemId, string returnUrl, bool stayOnSamePage, bool createNewAfterEdit, Func conditionallyPublish) + private async Task EditPOST(string contentItemId, string returnUrl, string submit, Func conditionallyPublish) { + var stayOnSamePage = submit.Contains("Continue"); + var createNew = submit.Contains("CreateNew"); + var contentItem = await _contentManager.GetAsync(contentItemId, VersionOptions.DraftRequired); if (contentItem == null) @@ -558,7 +552,7 @@ private async Task EditPOST(string contentItemId, string returnUr { return RedirectToAction("Edit", new RouteValueDictionary { { "ContentItemId", contentItem.ContentItemId }, { "returnUrl", returnUrl } }); } - else if (createNewAfterEdit) + else if (createNew) { return RedirectToAction("Create", new RouteValueDictionary { { "id", contentItem.ContentType }, { "returnUrl", returnUrl } }); } From eb413d3b5611ed2f7c454008f40e9a5463adf3e3 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 15 May 2019 03:02:19 -0400 Subject: [PATCH 07/24] menuItem.Url should not be used for returning the proper returnUrl --- .../OrchardCore.Navigation.Core/NavigationManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs index 6916bbb5bfe..1b555531102 100644 --- a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs +++ b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs @@ -171,7 +171,7 @@ private List ComputeHref(List menuItems, ActionContext actio { if (menuItem.ReturnUrlRouteValues != null) { - var returnUrl = GetUrl(menuItem.Url, menuItem.ReturnUrlRouteValues, actionContext); + var returnUrl = GetUrl(null, menuItem.ReturnUrlRouteValues, actionContext); menuItem.Href = GetUrl(menuItem.Url, menuItem.RouteValues, actionContext) + "?returnUrl=" + returnUrl; } else { From 53aa91e74d951e04ff005d5a59328f91aa9d8010 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 15 May 2019 03:14:52 -0400 Subject: [PATCH 08/24] simplify code --- .../OrchardCore.Navigation.Core/NavigationManager.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs index 1b555531102..943d36ec102 100644 --- a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs +++ b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs @@ -171,8 +171,7 @@ private List ComputeHref(List menuItems, ActionContext actio { if (menuItem.ReturnUrlRouteValues != null) { - var returnUrl = GetUrl(null, menuItem.ReturnUrlRouteValues, actionContext); - menuItem.Href = GetUrl(menuItem.Url, menuItem.RouteValues, actionContext) + "?returnUrl=" + returnUrl; + menuItem.Href = GetUrl(menuItem.Url, menuItem.RouteValues, actionContext) + "?returnUrl=" + GetUrl(null, menuItem.ReturnUrlRouteValues, actionContext); } else { menuItem.Href = GetUrl(menuItem.Url, menuItem.RouteValues, actionContext); From 85847acc53043e242d980689274e78b13b976c59 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 15 May 2019 03:32:50 -0400 Subject: [PATCH 09/24] fix Razor templates --- .../Views/Content.PublishButton.cshtml | 30 ++++++++---------- .../Views/Content.SaveDraftButton.cshtml | 31 +++++++++---------- 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml index 93245492fd4..270f1f7b0bc 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml @@ -1,24 +1,20 @@ -@*@if (Authorizer.Authorize(Permissions.PublishContent, (IContent)Model.ContentItem)) {*@ @{ var returnUrl = Context.Request.Query["returnUrl"]; } -@if (String.IsNullOrWhiteSpace(returnUrl)) -{ - -} -else -{ -
- - - diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml index 004d93aa121..cad522a2b0f 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml @@ -1,20 +1,19 @@ @{ var returnUrl = Context.Request.Query["returnUrl"]; } -@if (String.IsNullOrWhiteSpace(returnUrl)) -{ - -} -else -{ -
- - - +
+ + + -} \ No newline at end of file +
From 37714426613cdcfc394672b18280108f30c86570 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 15 May 2019 03:40:16 -0400 Subject: [PATCH 10/24] code cleanup --- .../OrchardCore.Contents/Controllers/AdminController.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs index 1b8a6a95fb7..cad9abc2e3c 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs @@ -403,7 +403,6 @@ private async Task CreatePOST(string id, string returnUrl, string if (createNew) { return RedirectToAction("Create", new RouteValueDictionary { { "id", id }, { "returnUrl", returnUrl } }); - } else { From f50d22241f56e52896b80a1b093abd5f6490a204 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 15 May 2019 04:03:16 -0400 Subject: [PATCH 11/24] moving code block inside "if" to make this more readable --- .../Controllers/AdminController.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs index cad9abc2e3c..b66e5bf243b 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs @@ -410,16 +410,16 @@ private async Task CreatePOST(string id, string returnUrl, string { return LocalRedirect(returnUrl); } - } - var adminRouteValues = (await _contentManager.PopulateAspectAsync(contentItem)).AdminRouteValues; + var adminRouteValues = (await _contentManager.PopulateAspectAsync(contentItem)).AdminRouteValues; - if (!String.IsNullOrEmpty(returnUrl)) - { - adminRouteValues.Add("returnUrl", returnUrl); - } + if (!String.IsNullOrEmpty(returnUrl)) + { + adminRouteValues.Add("returnUrl", returnUrl); + } - return RedirectToRoute(adminRouteValues); + return RedirectToRoute(adminRouteValues); + } } public async Task Display(string contentItemId) From 2d60fdad77c4069c4809d320ae36535f7ae2d2b3 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 15 May 2019 15:24:41 -0400 Subject: [PATCH 12/24] Use hidden input instead for returnUrl. Reverting changes on NavigationItermBuilder. --- .../OrchardCore.Contents/AdminMenu.cs | 1 - .../Controllers/AdminController.cs | 4 ++-- .../OrchardCore.Contents/Views/Admin/Create.cshtml | 3 ++- .../OrchardCore.Contents/Views/Admin/Edit.cshtml | 3 ++- .../Views/Content.PublishButton.cshtml | 12 +++--------- .../Views/Content.SaveDraftButton.cshtml | 13 ++++--------- .../OrchardCore.Navigation.Core/MenuItem.cs | 7 +------ .../NavigationItemBuilder.cs | 13 ------------- .../NavigationManager.cs | 10 ++-------- 9 files changed, 16 insertions(+), 50 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs b/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs index 79fa191ab09..baa0d7520de 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs @@ -59,7 +59,6 @@ public async Task BuildNavigationAsync(string name, NavigationBuilder builder) if (createRouteValues.Any()) newMenu.Add(new LocalizedString(contentTypeDefinition.DisplayName, contentTypeDefinition.DisplayName), "5", item => item .Action(cim.CreateRouteValues["Action"] as string, cim.CreateRouteValues["Controller"] as string, cim.CreateRouteValues) - .ReturnUrl("List", "Admin", "OrchardCore.Contents") .Permission(ContentTypePermissions.CreateDynamicPermission(ContentTypePermissions.PermissionTemplates[Permissions.PublishOwnContent.Name], contentTypeDefinition)) ); } diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs index b66e5bf243b..95cf0f7126d 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs @@ -408,7 +408,7 @@ private async Task CreatePOST(string id, string returnUrl, string { if (!String.IsNullOrEmpty(returnUrl) && !stayOnSamePage) { - return LocalRedirect(returnUrl); + return Redirect(returnUrl); } var adminRouteValues = (await _contentManager.PopulateAspectAsync(contentItem)).AdminRouteValues; @@ -557,7 +557,7 @@ private async Task EditPOST(string contentItemId, string returnUr } else { - return LocalRedirect(returnUrl); + return Redirect(returnUrl); } } diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Create.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Create.cshtml index 8f2ba0ae5c0..fdcd6c4df1f 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Create.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Create.cshtml @@ -11,7 +11,8 @@ }

@RenderTitleSegments(T["New {0}", Html.Raw(typeDisplayName)])

-
+ + @Html.ValidationSummary() @await DisplayAsync(Model)
\ No newline at end of file diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Edit.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Edit.cshtml index 6c86fbfb59a..b2dcbff90e9 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Edit.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Edit.cshtml @@ -12,7 +12,8 @@

@RenderTitleSegments(T["Edit {0}", Html.Raw(typeDisplayName)])

-
+ + @Html.ValidationSummary() @await DisplayAsync(Model)
\ No newline at end of file diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml index 270f1f7b0bc..3aadd6208f9 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml @@ -1,20 +1,14 @@ -@{ - var returnUrl = Context.Request.Query["returnUrl"]; -}
diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml index cad522a2b0f..83e43d02849 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml @@ -1,19 +1,14 @@ -@{ - var returnUrl = Context.Request.Query["returnUrl"]; -} +
diff --git a/src/OrchardCore/OrchardCore.Navigation.Core/MenuItem.cs b/src/OrchardCore/OrchardCore.Navigation.Core/MenuItem.cs index a129563ae25..69a066597ef 100644 --- a/src/OrchardCore/OrchardCore.Navigation.Core/MenuItem.cs +++ b/src/OrchardCore/OrchardCore.Navigation.Core/MenuItem.cs @@ -1,7 +1,7 @@ +using System.Collections.Generic; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Localization; using OrchardCore.Security.Permissions; -using System.Collections.Generic; namespace OrchardCore.Navigation { @@ -80,11 +80,6 @@ public MenuItem() /// public RouteValueDictionary RouteValues { get; set; } - /// - /// The optional route values for this menu item Return Url. - /// - public RouteValueDictionary ReturnUrlRouteValues { get; set; } - /// /// The list of objects the user must have in order to see this menu item. /// diff --git a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationItemBuilder.cs b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationItemBuilder.cs index 540d1e152d4..4b9fd3b69ce 100644 --- a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationItemBuilder.cs +++ b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationItemBuilder.cs @@ -143,19 +143,6 @@ public NavigationItemBuilder Action(string actionName, string controllerName, st return Action(actionName, controllerName, areaName, new RouteValueDictionary()); } - public NavigationItemBuilder ReturnUrl(string actionName, string controllerName, string areaName) - { - _item.ReturnUrlRouteValues = new RouteValueDictionary(); - if (!string.IsNullOrEmpty(actionName)) - _item.ReturnUrlRouteValues["action"] = actionName; - if (!string.IsNullOrEmpty(controllerName)) - _item.ReturnUrlRouteValues["controller"] = controllerName; - if (!string.IsNullOrEmpty(areaName)) - _item.ReturnUrlRouteValues["area"] = areaName; - - return this; - } - public NavigationItemBuilder Action(string actionName, string controllerName, string areaName, RouteValueDictionary values) { _item.RouteValues = new RouteValueDictionary(values); diff --git a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs index 943d36ec102..8af4aa460a1 100644 --- a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs +++ b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs @@ -169,14 +169,8 @@ private List ComputeHref(List menuItems, ActionContext actio { foreach (var menuItem in menuItems) { - if (menuItem.ReturnUrlRouteValues != null) - { - menuItem.Href = GetUrl(menuItem.Url, menuItem.RouteValues, actionContext) + "?returnUrl=" + GetUrl(null, menuItem.ReturnUrlRouteValues, actionContext); - } - else { - menuItem.Href = GetUrl(menuItem.Url, menuItem.RouteValues, actionContext); - } - + menuItem.Href = GetUrl(menuItem.Url, menuItem.RouteValues, actionContext); + menuItem.Items = ComputeHref(menuItem.Items, actionContext); } From 225d2a851831af011a0ac8a6aefe270f9e0b2e48 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 15 May 2019 15:29:56 -0400 Subject: [PATCH 13/24] code formatting --- .../Views/Content.PublishButton.cshtml | 7 ++----- .../Views/Content.SaveDraftButton.cshtml | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml index 3aadd6208f9..7d0163df381 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.PublishButton.cshtml @@ -4,11 +4,8 @@ @T["Toggle Dropdown"]
diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml index 83e43d02849..ccc00aed426 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml @@ -5,10 +5,7 @@ @T["Toggle Dropdown"]
From cb75b5b0ce421fd36513dd089a82450d8a5b66c4 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 15 May 2019 15:33:15 -0400 Subject: [PATCH 14/24] revert change on AdminMenu (code format) --- src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs b/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs index baa0d7520de..a44c0d7d166 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/AdminMenu.cs @@ -55,7 +55,6 @@ public async Task BuildNavigationAsync(string name, NavigationBuilder builder) var ci = await _contentManager.NewAsync(contentTypeDefinition.Name); var cim = await _contentManager.PopulateAspectAsync(ci); var createRouteValues = cim.CreateRouteValues; - if (createRouteValues.Any()) newMenu.Add(new LocalizedString(contentTypeDefinition.DisplayName, contentTypeDefinition.DisplayName), "5", item => item .Action(cim.CreateRouteValues["Action"] as string, cim.CreateRouteValues["Controller"] as string, cim.CreateRouteValues) From 1a8af442dec8b409d5f4a9410cec6894d87621bc Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 15 May 2019 16:05:47 -0400 Subject: [PATCH 15/24] Parse refererUrl and return only PathAndQuery part since this should always be a local url. --- .../Controllers/AdminController.cs | 4 ++-- .../Views/Admin/Create.cshtml | 14 ++++++++++++-- .../OrchardCore.Contents/Views/Admin/Edit.cshtml | 15 ++++++++++++--- .../Views/Content.SaveDraftButton.cshtml | 1 - 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs index 95cf0f7126d..b66e5bf243b 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs @@ -408,7 +408,7 @@ private async Task CreatePOST(string id, string returnUrl, string { if (!String.IsNullOrEmpty(returnUrl) && !stayOnSamePage) { - return Redirect(returnUrl); + return LocalRedirect(returnUrl); } var adminRouteValues = (await _contentManager.PopulateAspectAsync(contentItem)).AdminRouteValues; @@ -557,7 +557,7 @@ private async Task EditPOST(string contentItemId, string returnUr } else { - return Redirect(returnUrl); + return LocalRedirect(returnUrl); } } diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Create.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Create.cshtml index fdcd6c4df1f..8c7d70897e1 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Create.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Create.cshtml @@ -8,11 +8,21 @@ ContentItem contentItem = Model.ContentItem; var contentTypeDefinition = ContentDefinitionManager.GetTypeDefinition(contentItem.ContentType); var typeDisplayName = contentTypeDefinition?.DisplayName ?? contentItem.ContentType.CamelFriendly(); + Uri returnUrl = null; + string refererUrl = Context.Request.Headers["Referer"].ToString(); + + if (!String.IsNullOrEmpty(refererUrl)) { + if (!refererUrl.Contains("://")) + { + refererUrl = Context.Request.Scheme + "://" + refererUrl; + } + returnUrl = new Uri(refererUrl); + } }

@RenderTitleSegments(T["New {0}", Html.Raw(typeDisplayName)])

-
- + + @Html.ValidationSummary() @await DisplayAsync(Model)
\ No newline at end of file diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Edit.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Edit.cshtml index b2dcbff90e9..80ac6786d05 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Edit.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Admin/Edit.cshtml @@ -8,12 +8,21 @@ ContentItem contentItem = Model.ContentItem; var contentTypeDefinition = ContentDefinitionManager.GetTypeDefinition(contentItem.ContentType); var typeDisplayName = contentTypeDefinition?.DisplayName ?? contentItem.ContentType.CamelFriendly(); + Uri returnUrl = null; + string refererUrl = Context.Request.Headers["Referer"].ToString(); + + if (!String.IsNullOrEmpty(refererUrl)) { + if (!refererUrl.Contains("://")) + { + refererUrl = Context.Request.Scheme + "://" + refererUrl; + } + returnUrl = new Uri(refererUrl); + } }

@RenderTitleSegments(T["Edit {0}", Html.Raw(typeDisplayName)])

- -
- + + @Html.ValidationSummary() @await DisplayAsync(Model)
\ No newline at end of file diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml index ccc00aed426..2575e3b124e 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml @@ -1,4 +1,3 @@ -
diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml index 2575e3b124e..d66e40c4d98 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Views/Content.SaveDraftButton.cshtml @@ -1,10 +1,16 @@ +@{ + var returnUrl = Context.Request.Query["returnUrl"]; +}
From 56e23390fd42e83043ab33f1c515229b1533bc5b Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 15 May 2019 18:16:48 -0400 Subject: [PATCH 21/24] code cleanup --- .../OrchardCore.Navigation.Core/NavigationManager.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs index 943d36ec102..d51ec4c3568 100644 --- a/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs +++ b/src/OrchardCore/OrchardCore.Navigation.Core/NavigationManager.cs @@ -7,7 +7,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Routing; -using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; using OrchardCore.Environment.Shell; @@ -30,8 +29,7 @@ public class NavigationManager : INavigationManager ILogger logger, ShellSettings shellSettings, IUrlHelperFactory urlHelperFactory, - IAuthorizationService authorizationService, - IStringLocalizer localizer + IAuthorizationService authorizationService ) { _navigationProviders = navigationProviders; @@ -39,11 +37,8 @@ IStringLocalizer localizer _shellSettings = shellSettings; _urlHelperFactory = urlHelperFactory; _authorizationService = authorizationService; - T = localizer; } - public IStringLocalizer T { get; set; } - public async Task> BuildMenuAsync(string name, ActionContext actionContext) { var builder = new NavigationBuilder(); From 025e795b63899a78bd134a1d78e71e9099675bba Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 15 May 2019 18:21:44 -0400 Subject: [PATCH 22/24] code cleanup (removing using) --- .../OrchardCore.Templates/Controllers/TemplateController.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Templates/Controllers/TemplateController.cs b/src/OrchardCore.Modules/OrchardCore.Templates/Controllers/TemplateController.cs index c5c25343548..cb85895a8dc 100644 --- a/src/OrchardCore.Modules/OrchardCore.Templates/Controllers/TemplateController.cs +++ b/src/OrchardCore.Modules/OrchardCore.Templates/Controllers/TemplateController.cs @@ -4,7 +4,6 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Localization; -using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Localization; using OrchardCore.Admin; using OrchardCore.DisplayManagement; From 31024a2b256d673f2b06c9e06f1900c387279d7e Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 29 May 2019 18:47:28 -0400 Subject: [PATCH 23/24] Verify LayerMetadata to return proper url. --- .../Controllers/AdminController.cs | 23 +++++++++++++++++-- .../OrchardCore.Contents.csproj | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs index 9cb093d8430..c278f9e94bc 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs @@ -19,6 +19,7 @@ using OrchardCore.DisplayManagement; using OrchardCore.DisplayManagement.ModelBinding; using OrchardCore.DisplayManagement.Notify; +using OrchardCore.Layers.Models; using OrchardCore.Modules; using OrchardCore.Mvc.ActionConstraints; using OrchardCore.Navigation; @@ -385,7 +386,16 @@ private async Task CreatePOST(string id, string returnUrl, string if (createNew) { - return RedirectToAction("Create", new RouteValueDictionary { { "id", id }, { "returnUrl", returnUrl } }); + var routeValueDictionnary = new RouteValueDictionary { { "id", id }, { "returnUrl", returnUrl } }; + var layerMetadata = contentItem.As(); + + if (layerMetadata != null) + { + routeValueDictionnary.Add("LayerMetadata.Zone", layerMetadata.Zone); + routeValueDictionnary.Add("LayerMetadata.Position", layerMetadata.Position + 1); + } + + return RedirectToAction("Create", routeValueDictionnary); } else { @@ -536,7 +546,16 @@ private async Task EditPOST(string contentItemId, string returnUr } else if (createNew) { - return RedirectToAction("Create", new RouteValueDictionary { { "id", contentItem.ContentType }, { "returnUrl", returnUrl } }); + var routeValueDictionnary = new RouteValueDictionary { { "id", contentItem.ContentType }, { "returnUrl", returnUrl } }; + var layerMetadata = contentItem.As(); + + if (layerMetadata != null) + { + routeValueDictionnary.Add("LayerMetadata.Zone", layerMetadata.Zone); + routeValueDictionnary.Add("LayerMetadata.Position", layerMetadata.Position + 1); + } + + return RedirectToAction("Create", routeValueDictionnary); } else { diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/OrchardCore.Contents.csproj b/src/OrchardCore.Modules/OrchardCore.Contents/OrchardCore.Contents.csproj index d7a4c45d73a..04e720af015 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/OrchardCore.Contents.csproj +++ b/src/OrchardCore.Modules/OrchardCore.Contents/OrchardCore.Contents.csproj @@ -20,6 +20,7 @@ + From e9cc506eafd9a4adfb982d18f3cf99bec7e780cb Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Wed, 5 Jun 2019 04:30:36 -0400 Subject: [PATCH 24/24] Fix create new button actions in OrchardCore.Menu module --- .../Controllers/AdminController.cs | 17 ++++++-------- .../Controllers/AdminController.cs | 23 +++++++++++++------ 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs index c278f9e94bc..6833364518c 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs @@ -536,15 +536,7 @@ private async Task EditPOST(string contentItemId, string returnUr await conditionallyPublish(contentItem); - if (returnUrl == null) - { - return RedirectToAction("Edit", new RouteValueDictionary { { "ContentItemId", contentItem.ContentItemId } }); - } - else if (stayOnSamePage) - { - return RedirectToAction("Edit", new RouteValueDictionary { { "ContentItemId", contentItem.ContentItemId }, { "returnUrl", returnUrl } }); - } - else if (createNew) + if (createNew) { var routeValueDictionnary = new RouteValueDictionary { { "id", contentItem.ContentType }, { "returnUrl", returnUrl } }; var layerMetadata = contentItem.As(); @@ -559,7 +551,12 @@ private async Task EditPOST(string contentItemId, string returnUr } else { - return LocalRedirect(returnUrl); + if (!String.IsNullOrEmpty(returnUrl) && !stayOnSamePage) + { + return LocalRedirect(returnUrl); + } + + return RedirectToAction("Edit", new RouteValueDictionary { { "ContentItemId", contentItem.ContentItemId }, { "returnUrl", returnUrl } }); } } diff --git a/src/OrchardCore.Modules/OrchardCore.Menu/Controllers/AdminController.cs b/src/OrchardCore.Modules/OrchardCore.Menu/Controllers/AdminController.cs index 77bf46e0b47..8c67928e85a 100644 --- a/src/OrchardCore.Modules/OrchardCore.Menu/Controllers/AdminController.cs +++ b/src/OrchardCore.Modules/OrchardCore.Menu/Controllers/AdminController.cs @@ -6,11 +6,12 @@ using Newtonsoft.Json.Linq; using OrchardCore.ContentManagement; using OrchardCore.ContentManagement.Display; -using OrchardCore.ContentManagement.Metadata.Settings; using OrchardCore.ContentManagement.Metadata; +using OrchardCore.ContentManagement.Metadata.Settings; using OrchardCore.DisplayManagement.ModelBinding; using OrchardCore.DisplayManagement.Notify; using OrchardCore.Menu.Models; +using OrchardCore.Mvc.ActionConstraints; using YesSql; namespace OrchardCore.Menu.Controllers @@ -66,9 +67,9 @@ public async Task Create(string id, string menuContentItemId, str return View(model); } - [HttpPost] - [ActionName("Create")] - public async Task CreatePost(string id, string menuContentItemId, string menuItemId) + [HttpPost, ActionName("Create")] + [FormValueRequired("submit.Publish")] + public async Task CreatePost(string id, [Bind(Prefix = "submit.Publish")] string submitPublish, string menuContentItemId, string menuItemId) { if (!await _authorizationService.AuthorizeAsync(User, Permissions.ManageMenu)) { @@ -76,6 +77,7 @@ public async Task CreatePost(string id, string menuContentItemId, } ContentItem menu; + var createNew = submitPublish.Contains("CreateNew"); var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition("Menu"); @@ -132,7 +134,14 @@ public async Task CreatePost(string id, string menuContentItemId, _session.Save(menu); - return RedirectToAction("Edit", "Admin", new { area = "OrchardCore.Contents", contentItemId = menuContentItemId }); + if (createNew) + { + return RedirectToAction("Create", "Admin", new { area = "OrchardCore.Menu", menuContentItemId, menuItemId }); + } + else + { + return RedirectToAction("Edit", "Admin", new { area = "OrchardCore.Contents", contentItemId = menuContentItemId }); + } } public async Task Edit(string menuContentItemId, string menuItemId) @@ -168,8 +177,8 @@ public async Task Edit(string menuContentItemId, string menuItemI return View(model); } - [HttpPost] - [ActionName("Edit")] + [HttpPost, ActionName("Edit")] + [FormValueRequired("submit.Save")] public async Task EditPost(string menuContentItemId, string menuItemId) { if (!await _authorizationService.AuthorizeAsync(User, Permissions.ManageMenu))