.net core 3.1 中的ExpressionMetadataProvider

问题描述 投票:0回答:3

将.net core 2.2迁移到3.1,我在使用“Microsoft.AspNetCore.Mvc.ViewFeatures”时遇到问题。 在此代码中,ExpressionMetadataProvider.FromLambdaExpression 在 .net core 3.1 中不支持。

public static IHtmlContent CustomTextBoxFor<TModel, TProperty>(
        this IHtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression,
        object htmlAttributes
    )
    {
        var member = expression.Body as MemberExpression;
        var stringLength = member.Member
            .GetCustomAttributes(typeof(StringLengthAttribute), false)
            .FirstOrDefault() as StringLengthAttribute;

        var expresionProvider = htmlHelper.ViewContext.HttpContext.RequestServices
   .GetService(typeof(ModelExpressionProvider)) as ModelExpressionProvider;

        var modelExplorer = ExpressionMetadataProvider.FromLambdaExpression(expression, htmlHelper.ViewData, htmlHelper.MetadataProvider);

        ModelMetadata metadata = modelExplorer.Metadata;
        string htmlFieldName = expresionProvider.GetExpressionText(expression);
        string labelText = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();
c# asp.net-core asp.net-core-mvc
3个回答
2
投票

问题是关于.NET Core 3.1;但我偶然发现了这一点,因为我在 .NET 6 中遇到了同样的问题

获取实际值的片段

HttpContext.RequestServices.GetRequiredService<IModelExpressionProvider>().CreateModelExpression(viewData, expression).ModelExplorer.Model;


1
投票

将.net core 2.2迁移到3.1,我在使用“Microsoft.AspNetCore.Mvc.ViewFeatures”时遇到问题。在此代码中,ExpressionMetadataProvider.FromLambdaExpression 在 .net core 3.1 中不支持。

从 ASP.NET Core 3.0 开始,一些

pubinternal
API 已更新为真正内部的,这似乎导致了您的上述问题。

正如这个github问题中提到的,它在3.0+中提供了

ModelExpressionProvider
,可以从DI获得,并公开可以返回
ModelExpression
实例的方法,它是
ModelExplorer
的超集
ExpressionMetadataProvider
回归。


0
投票

这是 core 9.0 的工作版本

    public static IHtmlContent CustomTextBoxFor<TModel, TProperty>(
        this IHtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression,
        object htmlAttributes
    )
    {
        var expresionProvider = htmlHelper.ViewContext.HttpContext.RequestServices.GetService(typeof(ModelExpressionProvider)) as ModelExpressionProvider;
        //var expresionProvider = new ModelExpressionProvider(html.MetadataProvider);

        var exp = expresionProvider.CreateModelExpression(htmlHelper.ViewData, expression);
        var metadata = exp.ModelExplorer.Metadata;            
        var htmlFieldName = expresionProvider.GetExpressionText(expression);
        var labelText = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();
        return new HtmlString(htmlFieldName + ":" + labelText);
    }
© www.soinside.com 2019 - 2024. All rights reserved.