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())
{