gpt4 book ai didi

c# - 显示属性中的 ASP .Net Core 3.0 ShortName (DataAnnotations)

转载 作者:行者123 更新时间:2023-12-02 09:10:31 24 4
gpt4 key购买 nike

这个问题过去曾被问过,答案在这里 https://stackoverflow.com/a/45236544/3074765一直是我的救星。问题是当我迁移到.Net Core 3.0 时,它崩溃了。原因可以在这里找到https://github.com/aspnet/AspNetCore/issues/8678 。简而言之,微软公开了一些标记为内部的类中的函数。修复此问题删除了对 ExpressionMetadataProvider 的访问。考虑以下 HTML 帮助程序

using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal;

public static class MvcHtmlHelpers
{
private static IHtmlContent MetaDataFor<TModel, TValue>(this IHtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression,
Func<ModelMetadata, string> property)
{
if (html == null) throw new ArgumentNullException(nameof(html));
if (expression == null) throw new ArgumentNullException(nameof(expression));

var modelExplorer = ExpressionMetadataProvider.FromLambdaExpression(expression, html.ViewData, html.MetadataProvider);
if (modelExplorer == null) throw new InvalidOperationException($"Failed to get model explorer for {ExpressionHelper.GetExpressionText(expression)}");
return new HtmlString(property(modelExplorer.Metadata));
}

public static IHtmlContent DescriptionFor<TModel, TValue>(this IHtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
return html.MetaDataFor(expression, m => m.Description ?? m.Name);
}

public static IHtmlContent ShortNameFor<TModel, TValue>(this IHtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression)
{
return html.MetaDataFor(expression, m =>
{
var defaultMetadata = m as
Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadata;
if (defaultMetadata != null)
{
var displayAttribute = defaultMetadata.Attributes.Attributes
.OfType<DisplayAttribute>()
.FirstOrDefault();
if (displayAttribute != null)
{
return displayAttribute.ShortName ?? m.DisplayName ?? m.Name;
}
}
//Return a default value if the property doesn't have a DisplayAttribute
return m.DisplayName ?? m.Name;
});
}
}

当您按照以下步骤迁移到 .Net Core 3.0 时,无法再解析 ExpressionMetadataProvider 和 ExpressionHelper。

最佳答案

在 .Net Core 3.0 中,Microsoft 提供了一种使用依赖注入(inject)和名为 ModelExpressionProvider 的服务来获取相同元数据的方法。您可以通过 IHtmlHelper 中的 HttpContext 访问该服务。只需将 using 替换为:

using Microsoft.AspNetCore.Mvc.ViewFeatures;

这会删除 .Internal,并将 MetaDataFor 函数替换为:

    private static IHtmlContent MetaDataFor<TModel, TValue>(this IHtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression,
Func<ModelMetadata, string> property)
{
if (html == null) throw new ArgumentNullException(nameof(html));
if (expression == null) throw new ArgumentNullException(nameof(expression));

ModelExpressionProvider modelExpressionProvider = (ModelExpressionProvider)html.ViewContext.HttpContext.RequestServices.GetService(typeof(IModelExpressionProvider));

var modelExplorer = modelExpressionProvider.CreateModelExpression(html.ViewData, expression);
if (modelExplorer == null) throw new InvalidOperationException($"Failed to get model explorer for {modelExpressionProvider.GetExpressionText(expression)}");

return new HtmlString(property(modelExplorer.Metadata));
}

一旦修复了 MetaDataFor 以检索它们所需的内容,其他两个扩展函数就可以正常工作。

干杯!

关于c# - 显示属性中的 ASP .Net Core 3.0 ShortName (DataAnnotations),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59000215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com