/// <summary> /// Converts a dictionary object to a query string representation such as: /// firstname=shannon&lastname=deminick /// </summary> /// <param name="d"></param> /// <param name="urlEncoder"></param> /// <returns></returns> public static string ToQueryString(this IDictionary<string, object> d, IUrlEncoder urlEncoder) { if (!d.Any()) return ""; var builder = new StringBuilder(); foreach (var i in d) { builder.Append($"{urlEncoder.UrlEncode(i.Key)}={(i.Value == null ? string.Empty : urlEncoder.UrlEncode(i.Value.ToString()))}&"); } return builder.ToString().TrimEnd('&'); }
/// <summary> /// This is used in methods like BeginUmbracoForm and SurfaceAction to generate an encrypted string which gets submitted in a request for which /// Umbraco can decrypt during the routing process in order to delegate the request to a specific MVC Controller. /// </summary> /// <param name="urlEncoder"></param> /// <param name="controllerName"></param> /// <param name="controllerAction"></param> /// <param name="area"></param> /// <param name="additionalRouteVals"></param> /// <returns></returns> public string CreateEncryptedRouteString(IUrlEncoder urlEncoder, string controllerName, string controllerAction, string area, object additionalRouteVals = null) { //need to create a params string as Base64 to put into our hidden field to use during the routes var surfaceRouteParams = $"{ReservedAdditionalKeys.Controller}={urlEncoder.UrlEncode(controllerName)}&{ReservedAdditionalKeys.Action}={urlEncoder.UrlEncode(controllerAction)}&{ReservedAdditionalKeys.Area}={area}"; var additionalRouteValsAsQuery = additionalRouteVals?.ToDictionary<object>().ToQueryString(urlEncoder); if (string.IsNullOrWhiteSpace(additionalRouteValsAsQuery) == false) surfaceRouteParams += "&" + additionalRouteValsAsQuery; return Convert.ToBase64String(_dataProtector.Protect(Encoding.UTF8.GetBytes(surfaceRouteParams))); }
//TODO: Need to implement something similar /// <summary> /// This is used in methods like BeginUmbracoForm and SurfaceAction to generate an encrypted string which gets submitted in a request for which /// Umbraco can decrypt during the routing process in order to delegate the request to a specific MVC Controller. /// </summary> /// <param name="urlEncoder"></param> /// <param name="controllerName"></param> /// <param name="controllerAction"></param> /// <param name="area"></param> /// <param name="additionalRouteVals"></param> /// <returns></returns> internal static string CreateEncryptedRouteString(IUrlEncoder urlEncoder, string controllerName, string controllerAction, string area, object additionalRouteVals = null) { //need to create a params string as Base64 to put into our hidden field to use during the routes var surfaceRouteParams = $"c={urlEncoder.UrlEncode(controllerName)}&a={urlEncoder.UrlEncode(controllerAction)}&ar={area}"; var additionalRouteValsAsQuery = additionalRouteVals ?. ToDictionary<object>().ToQueryString(urlEncoder); if (string.IsNullOrWhiteSpace(additionalRouteValsAsQuery) == false) surfaceRouteParams += "&" + additionalRouteValsAsQuery; //TODO: We need to encrypt! for now we'll base64 :( //return surfaceRouteParams.EncryptWithMachineKey(); return Convert.ToBase64String(Encoding.UTF8.GetBytes(surfaceRouteParams)); }
//TODO: Need to implement something similar /// <summary> /// This is used in methods like BeginUmbracoForm and SurfaceAction to generate an encrypted string which gets submitted in a request for which /// Umbraco can decrypt during the routing process in order to delegate the request to a specific MVC Controller. /// </summary> /// <param name="urlEncoder"></param> /// <param name="controllerName"></param> /// <param name="controllerAction"></param> /// <param name="area"></param> /// <param name="additionalRouteVals"></param> /// <returns></returns> internal static string CreateEncryptedRouteString(IUrlEncoder urlEncoder, string controllerName, string controllerAction, string area, object additionalRouteVals = null) { //need to create a params string as Base64 to put into our hidden field to use during the routes var surfaceRouteParams = $"c={urlEncoder.UrlEncode(controllerName)}&a={urlEncoder.UrlEncode(controllerAction)}&ar={area}"; var additionalRouteValsAsQuery = additionalRouteVals?.ToDictionary <object>().ToQueryString(urlEncoder); if (string.IsNullOrWhiteSpace(additionalRouteValsAsQuery) == false) { surfaceRouteParams += "&" + additionalRouteValsAsQuery; } //TODO: We need to encrypt! for now we'll base64 :( //return surfaceRouteParams.EncryptWithMachineKey(); return(Convert.ToBase64String(Encoding.UTF8.GetBytes(surfaceRouteParams))); }
/// <summary> /// URL-encodes a string and writes the result to the supplied output. /// </summary> /// <remarks> /// The encoded value is safe for use in the segment, query, or /// fragment portion of a URI. /// </remarks> public static void UrlEncode(this IUrlEncoder urlEncoder, string value, TextWriter output) { if (urlEncoder == null) { throw new ArgumentNullException(nameof(urlEncoder)); } if (!String.IsNullOrEmpty(value)) { urlEncoder.UrlEncode(value, 0, value.Length, output); } }
/// <summary> /// This is used in methods like BeginUmbracoForm and SurfaceAction to generate an encrypted string which gets submitted in a request for which /// Umbraco can decrypt during the routing process in order to delegate the request to a specific MVC Controller. /// </summary> /// <param name="urlEncoder"></param> /// <param name="controllerName"></param> /// <param name="controllerAction"></param> /// <param name="area"></param> /// <param name="additionalRouteVals"></param> /// <returns></returns> public string CreateEncryptedRouteString(IUrlEncoder urlEncoder, string controllerName, string controllerAction, string area, object additionalRouteVals = null) { //need to create a params string as Base64 to put into our hidden field to use during the routes var surfaceRouteParams = $"{ReservedAdditionalKeys.Controller}={urlEncoder.UrlEncode(controllerName)}&{ReservedAdditionalKeys.Action}={urlEncoder.UrlEncode(controllerAction)}&{ReservedAdditionalKeys.Area}={area}"; var additionalRouteValsAsQuery = additionalRouteVals?.ToDictionary <object>().ToQueryString(urlEncoder); if (string.IsNullOrWhiteSpace(additionalRouteValsAsQuery) == false) { surfaceRouteParams += "&" + additionalRouteValsAsQuery; } return(Convert.ToBase64String(_dataProtector.Protect(Encoding.UTF8.GetBytes(surfaceRouteParams)))); }
/// <summary> /// Converts a dictionary object to a query string representation such as: /// firstname=shannon&lastname=deminick /// </summary> /// <param name="d"></param> /// <param name="urlEncoder"></param> /// <returns></returns> public static string ToQueryString(this IDictionary <string, object> d, IUrlEncoder urlEncoder) { if (!d.Any()) { return(""); } var builder = new StringBuilder(); foreach (var i in d) { builder.Append($"{urlEncoder.UrlEncode(i.Key)}={(i.Value == null ? string.Empty : urlEncoder.UrlEncode(i.Value.ToString()))}&"); } return(builder.ToString().TrimEnd('&')); }