IHtmlHelper в ASP.NET CORE 3.0 - как правильно получить значение свойства? - PullRequest
0 голосов
/ 23 октября 2019

В MVC было множество полезных помощников для работы с HtmlHelper с. Теперь все они исчезли, и я пытаюсь перенести одно из своих приложений в CORE 3.0.

У меня есть помощник со следующей подписью:

public static IHtmlContent BootstrapDropDownFor<TModel, TValue>(
    this IHtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, 
    List<SelectListItem> selectListItems, 
    object htmlAttributes)
{

Я хотел бы знатькак правильно получить значение / имя свойства из самого выражения.

В качестве обходного пути я использую это:

public static PropertyInfo GetPropertyInfo<TSource, TProperty>(
    this TSource source,
    Expression<Func<TSource, TProperty>> expr)
{
    var type = typeof(TSource);
    if (!(expr.Body is MemberExpression member))
        throw new ArgumentException($"Expression '{expr}' refers to a method, not a property.");
    var propInfo = member.Member as PropertyInfo;
    if (propInfo == null)
        throw new ArgumentException($"Expression '{expr}' refers to a field, not a property.");
    if (type != propInfo.ReflectedType && propInfo.ReflectedType != null && !type.IsSubclassOf(propInfo.ReflectedType))
        throw new ArgumentException($"Expression '{expr}' refers to a property that is not from type {type}.");
    return propInfo;
}

public static TProperty GetProperty<TSource, TProperty>(
    this TSource source,
    Expression<Func<TSource, TProperty>> expr)
{
    return (TProperty) source.GetPropertyInfo(expr).GetValue(source);
}

public static string GetPropertyName<TSource, TProperty>(
    this TSource source,
    Expression<Func<TSource, TProperty>> expr)
{
    return source.GetPropertyInfo(expr).Name;
}

:

var exprPropName = model.GetPropertyName(expression);

var exprProp = model.GetProperty(expression)

Я просто хочу знать, что является заменой отсутствующей логики (возможно, связано сModelExplorer / метаданные, если есть)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...