From 6c0321ce72959877e611ced85a1cff8ca41dec33 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 30 Jan 2019 19:48:42 +1100 Subject: [PATCH] Fixing trees regression issue --- .../FormDataCollectionExtensions.cs | 19 +++++++++++++++++++ .../Trees/ApplicationTreeController.cs | 10 +++++----- .../Trees/ContentTreeControllerBase.cs | 2 +- src/Umbraco.Web/Trees/MemberTreeController.cs | 4 ++-- .../Trees/TemplatesTreeController.cs | 2 +- 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web/FormDataCollectionExtensions.cs b/src/Umbraco.Web/FormDataCollectionExtensions.cs index 95c418525a..52f86dcc59 100644 --- a/src/Umbraco.Web/FormDataCollectionExtensions.cs +++ b/src/Umbraco.Web/FormDataCollectionExtensions.cs @@ -81,5 +81,24 @@ namespace Umbraco.Web ? converted.Result : default(T); } + + /// + /// Returns the object based in the collection based on it's key. This does this with a conversion so if it doesn't convert or the query string is no there an exception is thrown + /// + /// + /// + /// + /// + public static T GetRequiredValue(this FormDataCollection items, string key) + { + var val = items.Get(key); + if (string.IsNullOrEmpty(val)) + throw new InvalidOperationException($"The required query string parameter {key} is missing"); + + var converted = val.TryConvertTo(); + return converted.Success + ? converted.Result + : throw new InvalidOperationException($"The required query string parameter {key} cannot be converted to type {typeof(T)}"); + } } } diff --git a/src/Umbraco.Web/Trees/ApplicationTreeController.cs b/src/Umbraco.Web/Trees/ApplicationTreeController.cs index 28bc464d55..605d5e4352 100644 --- a/src/Umbraco.Web/Trees/ApplicationTreeController.cs +++ b/src/Umbraco.Web/Trees/ApplicationTreeController.cs @@ -47,11 +47,11 @@ namespace Umbraco.Web.Trees /// /// The application to load tree for /// An optional single tree alias, if specified will only load the single tree for the request app - /// + /// /// Tree use. /// [HttpQueryStringFilter("queryStrings")] - public async Task GetApplicationTrees(string application, string tree, FormDataCollection querystring, TreeUse use = TreeUse.Main) + public async Task GetApplicationTrees(string application, string tree, FormDataCollection queryStrings, TreeUse use = TreeUse.Main) { application = application.CleanForXss(); @@ -75,7 +75,7 @@ namespace Umbraco.Web.Trees if (t == null) throw new HttpResponseException(HttpStatusCode.NotFound); - var treeRootNode = await GetTreeRootNode(t, Constants.System.Root, querystring); + var treeRootNode = await GetTreeRootNode(t, Constants.System.Root, queryStrings); if (treeRootNode != null) return treeRootNode; @@ -89,7 +89,7 @@ namespace Umbraco.Web.Trees var nodes = new TreeNodeCollection(); foreach (var t in allTrees) { - var node = await TryGetRootNode(t, querystring); + var node = await TryGetRootNode(t, queryStrings); if (node != null) nodes.Add(node); } @@ -115,7 +115,7 @@ namespace Umbraco.Web.Trees var nodes = new TreeNodeCollection(); foreach (var t in trees) { - var node = await TryGetRootNode(t, querystring); + var node = await TryGetRootNode(t, queryStrings); if (node != null) nodes.Add(node); } diff --git a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs index bd35fd665f..ca2f2031bb 100644 --- a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs +++ b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs @@ -281,7 +281,7 @@ namespace Umbraco.Web.Trees Services.TextService.Localize("general/recycleBin"), "icon-trash", RecycleBinSmells, - queryStrings.GetValue("application") + TreeAlias.EnsureStartsWith('/') + "/recyclebin")); + queryStrings.GetRequiredValue("application") + TreeAlias.EnsureStartsWith('/') + "/recyclebin")); } diff --git a/src/Umbraco.Web/Trees/MemberTreeController.cs b/src/Umbraco.Web/Trees/MemberTreeController.cs index 03c68dd67a..430c5d2111 100644 --- a/src/Umbraco.Web/Trees/MemberTreeController.cs +++ b/src/Umbraco.Web/Trees/MemberTreeController.cs @@ -125,14 +125,14 @@ namespace Umbraco.Web.Trees { nodes.Add( CreateTreeNode(Constants.Conventions.MemberTypes.AllMembersListId, id, queryStrings, Services.TextService.Localize("member/allMembers"), "icon-users", true, - queryStrings.GetValue("application") + TreeAlias.EnsureStartsWith('/') + "/list/" + Constants.Conventions.MemberTypes.AllMembersListId)); + queryStrings.GetRequiredValue("application") + TreeAlias.EnsureStartsWith('/') + "/list/" + Constants.Conventions.MemberTypes.AllMembersListId)); if (_isUmbracoProvider) { nodes.AddRange(Services.MemberTypeService.GetAll() .Select(memberType => CreateTreeNode(memberType.Alias, id, queryStrings, memberType.Name, "icon-users", true, - queryStrings.GetValue("application") + TreeAlias.EnsureStartsWith('/') + "/list/" + memberType.Alias))); + queryStrings.GetRequiredValue("application") + TreeAlias.EnsureStartsWith('/') + "/list/" + memberType.Alias))); } } diff --git a/src/Umbraco.Web/Trees/TemplatesTreeController.cs b/src/Umbraco.Web/Trees/TemplatesTreeController.cs index 79a59435a0..916e5d4b4d 100644 --- a/src/Umbraco.Web/Trees/TemplatesTreeController.cs +++ b/src/Umbraco.Web/Trees/TemplatesTreeController.cs @@ -75,7 +75,7 @@ namespace Umbraco.Web.Trees //Create the normal create action var item = menu.Items.Add(Services.TextService, opensDialog: true); - item.NavigateToRoute($"{queryStrings.GetValue("application")}/templates/edit/{id}?create=true"); + item.NavigateToRoute($"{queryStrings.GetRequiredValue("application")}/templates/edit/{id}?create=true"); if (id == Constants.System.Root.ToInvariantString()) {