Uri extensions for read query values

- safe way to check if key is presented
- safe parsing int values in query
- should replace int.Parse()

  _jobId = Int32.Parse(PageState.QueryString["id"]);
  can throw unhandled exception when "id" is not int

  correct way
  if (PageState.Uri.TryGetQueryValueInt("id",out _jobId)) ....
This commit is contained in:
Pavel Vesely 2020-05-28 12:26:23 +02:00
parent e4b37c17d8
commit 151e37c470

View File

@ -1,5 +1,6 @@
using Oqtane.Models;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
@ -44,6 +45,7 @@ namespace Oqtane.Shared
path += $"/{action}";
}
}
return NavigateUrl(alias, path, parameters);
}
@ -98,6 +100,7 @@ namespace Oqtane.Shared
// remove assembly if fully qualified type
typename = typename.Substring(0, typename.IndexOf(","));
}
// segment 0 is the last segment, segment 1 is the second to last segment, etc...
string[] segments = typename.Split('.');
string name = "";
@ -105,6 +108,7 @@ namespace Oqtane.Shared
{
name = segments[segments.Length - (segment + 1)];
}
return name;
}
@ -142,11 +146,14 @@ namespace Oqtane.Shared
stringBuilder.Append('-');
prevdash = true;
}
break;
}
}
result = stringBuilder.ToString().Trim('-');
}
return result;
}
@ -245,10 +252,13 @@ namespace Oqtane.Shared
{
var separators = new char[] {Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar};
for (int i =1;i < segments.Length; i++){
if(Path.IsPathRooted(segments[i])){
for (int i = 1; i < segments.Length; i++)
{
if (Path.IsPathRooted(segments[i]))
{
segments[i] = segments[i].TrimStart(separators);
if(String.IsNullOrEmpty(segments[i])){
if (String.IsNullOrEmpty(segments[i]))
{
segments[i] = " ";
}
}
@ -273,5 +283,54 @@ namespace Oqtane.Shared
!Constants.InvalidFileNameEndingChars.Any(name.EndsWith) &&
!Constants.ReservedDevices.Split(',').Contains(name.ToUpper().Split('.')[0]));
}
public static bool TryGetQueryValue(
this Uri uri,
string key,
out string value,
string defaultValue = null)
{
value = defaultValue;
string query = uri.Query;
return !string.IsNullOrEmpty(query) && Utilities.ParseQueryString(query).TryGetValue(key, out value);
}
public static bool TryGetQueryValueInt(
this Uri uri,
string key,
out int value,
int defaultValue = 0)
{
value = defaultValue;
string s;
return uri.TryGetQueryValue(key, out s, (string) null) && int.TryParse(s, out value);
}
public static Dictionary<string, string> ParseQueryString(string query)
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
if (!string.IsNullOrEmpty(query))
{
query = query.Substring(1);
string str = query;
char[] separator = new char[1] {'&'};
foreach (string key in str.Split(separator, StringSplitOptions.RemoveEmptyEntries))
{
if (key != "")
{
if (key.Contains("="))
{
string[] strArray = key.Split('=', StringSplitOptions.None);
dictionary.Add(strArray[0], strArray[1]);
}
else
dictionary.Add(key, "true");
}
}
}
return dictionary;
}
}
}