using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Mvc; using System.Linq.Expressions; using System.Reflection; using Microsoft.AspNetCore.Mvc.Rendering; namespace Kit.Helpers { public static class SystemWebMvcExtensions { /// /// Преобразует перечень объектов в перечень элементов html-списка /// /// Тип преобразуемого объекта /// Перечень преобразуемых объектов /// Функция, возвращающая значение, используемое в качестве Value для элемента списка. /// Для преобразования возвращаемого значения в строку вызывается стандартная реализация ToString() /// Функция, возвращающая значение, используемое в качестве Text для элемента списка. /// Для преобразования возвращаемого значения в строку вызывается стандартная реализация ToString() public static IEnumerable ToSelectList( this IEnumerable items, Func valueSelector, Func textSelector) { if (valueSelector == null) throw new ArgumentNullException("valueSelector"); if (textSelector == null) throw new ArgumentNullException("textSelector"); return items.Select(i => new SelectListItem { Value = valueSelector(i).ToString(), Text = textSelector(i).ToString() }); } /// /// Преобразует перечень объектов в перечень элементов html-списка /// /// Тип преобразуемого объекта /// Перечень преобразуемых объектов /// Функция, возвращающая значение, используемое в качестве Value для элемента списка. /// Функция, возвращающая значение, используемое в качестве Text для элемента списка. public static IEnumerable ToSelectList( this IEnumerable items, Func valueSelector, Func textSelector) { if (valueSelector == null) throw new ArgumentNullException("valueSelector"); if (textSelector == null) throw new ArgumentNullException("textSelector"); return items.Select(i => new SelectListItem { Value = valueSelector(i), Text = textSelector(i) }); } /// /// Преобразует перечень объектов в перечень элементов html-списка /// /// Тип преобразуемого объекта /// Перечень преобразуемых объектов /// Функция, возвращающая значение, используемое в качестве Value для элемента списка. /// Функция, возвращающая значение, используемое в качестве Text для элемента списка. /// Список значений, которые необходимо отметить в результирующем списке как выбранные. public static IEnumerable ToSelectList( this IEnumerable items, Func valueSelector, Func textSelector, Func disabled) { if (valueSelector == null) throw new ArgumentNullException("valueSelector"); if (textSelector == null) throw new ArgumentNullException("textSelector"); return items.Select(i => new SelectListItem { Value = (valueSelector(i) != null ? valueSelector(i).ToString() : string.Empty), Text = (textSelector(i) != null ? textSelector(i).ToString() : string.Empty), Selected = disabled(i) }); } /// /// Преобразует перечень объектов в перечень элементов html-списка /// /// Тип преобразуемого объекта /// Перечень преобразуемых объектов /// Функция, возвращающая значение, используемое в качестве Value для элемента списка. /// Функция, возвращающая значение, используемое в качестве Text для элемента списка. /// Список значений, которые необходимо отметить в результирующем списке как выбранные. public static IEnumerable ToSelectList( this IEnumerable items, Func valueSelector, Func textSelector, TValue selectedValue) { if (valueSelector == null) throw new ArgumentNullException("valueSelector"); if (textSelector == null) throw new ArgumentNullException("textSelector"); return items.Select(i => new SelectListItem { Value = (valueSelector(i) != null ? valueSelector(i).ToString() : string.Empty), Text = (textSelector(i) != null ? textSelector(i).ToString() : string.Empty), Selected = (selectedValue != null && selectedValue.Equals(valueSelector(i))) }); } /// /// Преобразует перечень объектов в перечень элементов html-списка /// /// Тип преобразуемого объекта /// Перечень преобразуемых объектов /// Функция, возвращающая значение, используемое в качестве Value для элемента списка. /// Функция, возвращающая значение, используемое в качестве Text для элемента списка. /// Список значений, которые необходимо отметить в результирующем списке как выбранные. public static IEnumerable ToSelectList( this IEnumerable items, Func valueSelector, Func textSelector, IEnumerable selectedValues) { if (valueSelector == null) throw new ArgumentNullException("valueSelector"); if (textSelector == null) throw new ArgumentNullException("textSelector"); return items.Select(i => new SelectListItem { Value = (valueSelector(i) != null ? valueSelector(i).ToString() : string.Empty), Text = (textSelector(i) != null ? textSelector(i).ToString() : string.Empty), Selected = selectedValues != null && selectedValues.Contains(valueSelector(i)) }); } private static string GetLambdaAction(LambdaExpression actionSelector) { UnaryExpression? unaryExpression = (UnaryExpression)actionSelector.Body; MethodCallExpression? methodCallExpression = (MethodCallExpression)unaryExpression.Operand; ConstantExpression? constantExpression = (ConstantExpression)methodCallExpression.Object; MethodInfo? methodInfo = (MethodInfo)constantExpression.Value; string actionName = methodInfo.Name; return actionName; } public static string? Action(this IUrlHelper urlHelper, Expression> actionSelector, object? values = null, string? protocol = null) where TController : Controller { // получаем имя контроллера string controllerName = typeof(TController).Name; if (controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase) && controllerName.Length > "Controller".Length) { controllerName = controllerName.Remove(controllerName.Length - "Controller".Length, "Controller".Length); } return urlHelper.Action(GetLambdaAction(actionSelector), controllerName, values, protocol); } } }