将.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();
问题是关于.NET Core 3.1;但我偶然发现了这一点,因为我在 .NET 6 中遇到了同样的问题
获取实际值的片段
HttpContext.RequestServices.GetRequiredService<IModelExpressionProvider>().CreateModelExpression(viewData, expression).ModelExplorer.Model;
将.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
回归。
这是 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);
}