2018-06-29 19:52:40 +02:00
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Net.Http.Formatting ;
using System.Text ;
using Umbraco.Core ;
namespace Umbraco.Web
{
public static class FormDataCollectionExtensions
{
/// <summary>
/// Converts a dictionary object to a query string representation such as:
/// firstname=shannon&lastname=deminick
/// </summary>
/// <param name="items"></param>
/// <param name="keysToIgnore">Any keys found in this collection will be removed from the output</param>
/// <returns></returns>
public static string ToQueryString ( this FormDataCollection items , params string [ ] keysToIgnore )
{
if ( items = = null ) return "" ;
if ( items . Any ( ) = = false ) return "" ;
var builder = new StringBuilder ( ) ;
foreach ( var i in items . Where ( i = > keysToIgnore . InvariantContains ( i . Key ) = = false ) )
{
builder . Append ( string . Format ( "{0}={1}&" , i . Key , i . Value ) ) ;
}
return builder . ToString ( ) . TrimEnd ( '&' ) ;
}
/// <summary>
/// Converts the FormCollection to a dictionary
/// </summary>
/// <param name="items"></param>
/// <returns></returns>
public static IDictionary < string , object > ToDictionary ( this FormDataCollection items )
{
return items . ToDictionary ( x = > x . Key , x = > ( object ) x . Value ) ;
}
/// <summary>
/// Returns the value of a mandatory item in the FormCollection
/// </summary>
/// <param name="items"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string GetRequiredString ( this FormDataCollection items , string key )
{
if ( items . HasKey ( key ) = = false )
throw new ArgumentNullException ( "The " + key + " query string parameter was not found but is required" ) ;
return items . Single ( x = > x . Key . InvariantEquals ( key ) ) . Value ;
}
/// <summary>
/// Checks if the collection contains the key
/// </summary>
/// <param name="items"></param>
/// <param name="key"></param>
/// <returns></returns>
public static bool HasKey ( this FormDataCollection items , string key )
{
return items . Any ( x = > x . Key . InvariantEquals ( key ) ) ;
}
/// <summary>
/// Returns the object based in the collection based on it's key. This does this with a conversion so if it doesn't convert a null object is returned.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="items"></param>
/// <param name="key"></param>
/// <returns></returns>
public static T GetValue < T > ( this FormDataCollection items , string key )
{
var val = items . Get ( key ) ;
if ( string . IsNullOrEmpty ( val ) ) return default ( T ) ;
var converted = val . TryConvertTo < T > ( ) ;
return converted . Success
? converted . Result
: default ( T ) ;
}
2019-01-30 19:48:42 +11:00
/// <summary>
/// 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
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="items"></param>
/// <param name="key"></param>
/// <returns></returns>
public static T GetRequiredValue < T > ( 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 < T > ( ) ;
return converted . Success
? converted . Result
: throw new InvalidOperationException ( $"The required query string parameter {key} cannot be converted to type {typeof(T)}" ) ;
}
2018-06-29 19:52:40 +02:00
}
}