This commit is contained in:
2023-05-14 18:29:41 +03:00
parent ff965f08bd
commit ef329af61a
13 changed files with 455 additions and 95 deletions

View File

@@ -0,0 +1,110 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Primitives;
namespace anbs_cp.ForNet.Extensions;
/// <summary>
/// Расширение URLHelper
/// </summary>
public static class UrlHelperExtension
{
/// <summary>
/// Очищает URL, удаляя ненужные QueryString
/// </summary>
/// <param name="helper">
/// <see cref="IUrlHelper" />
/// </param>
/// <param name="context">
/// <see cref="HttpContext" />
/// </param>
/// <param name="url">Ссылка, которую нужно почистить</param>
/// <param name="clearQueryString">Массив ключей, которые нужно удалить</param>
/// <param name="getLocalURL">Возвращать только локальную ссылку</param>
/// <returns></returns>
public static string ParseURLQuery(this IUrlHelper helper, HttpContext context, string? url,
string[] clearQueryString, bool getLocalURL = true)
{
//Получаю returnURL
url ??= "/";
//Если адрес локальный, то преобразую в полный
if (helper.IsLocalUrl(url))
url = LocalToFullURL(helper, context, url);
//Создаю uri по адресу
Uri uri = new(url ?? "");
//Формат
const UriFormat format = UriFormat.UriEscaped;
//Формирую Uri-адрес сайта
string baseUri =
uri.GetComponents(UriComponents.Scheme | UriComponents.Host | UriComponents.Port,
format);
//Формирую локальную ссылку
string localUri = uri.GetComponents(UriComponents.Path, format);
//Создаю словарь запроса
Dictionary<string, StringValues> query = QueryHelpers.ParseQuery(uri.Query);
//Если он содержит параметр для очистки, то удаляю его
foreach (KeyValuePair<string, StringValues> queryItem in query.Where(queryItem =>
clearQueryString.Contains(queryItem.Key)))
query.Remove(queryItem.Key);
//Создаю список запроса, пригодный для QueryBuilder
List<KeyValuePair<string, string>> queryList = query.Select(static queryItem =>
new KeyValuePair<string, string>(queryItem.Key, queryItem.Value.ToString())).ToList();
//Запускаю построение новых параметров
QueryBuilder qBuilder = new(queryList);
//Создаю переменную-результат
string result = "";
//Если нужно получить полную ссылку
if (!getLocalURL)
result = baseUri;
//формирую переменную-результат
result = $"{result}/{localUri}{qBuilder.ToQueryString()}";
//Вывожу результат
return result;
}
/// <summary>
/// Получает локальный url-адрес
/// </summary>
/// <param name="helper"><see cref="IUrlHelper" /></param>
/// <param name="url">url-адрес</param>
/// <returns>Локальный url-адрес</returns>
public static string ToLocalURL (this IUrlHelper helper, string url)
{
//Создаю uri из url
Uri uri = new(url);
//Вывожу результат
return helper.IsLocalUrl(url) ? url : uri.PathAndQuery;
}
/// <summary>
/// Преобразует локальную ссылку в полную
/// </summary>
/// <param name="helper">
/// <see cref="IUrlHelper" />
/// </param>
/// <param name="context">
/// <see cref="HttpContext" />
/// </param>
/// <param name="url">Ссылка</param>
/// <returns>
/// <see cref="string" />
/// </returns>
public static string? LocalToFullURL (this IUrlHelper helper, HttpContext context, string? url) =>
helper.IsLocalUrl(url) ? $"{context.Request.Scheme}://{context.Request.Host}{url}" : url;
}