Asp.NET MvcHtmlString和ModelMetadata.FromLambdaExpression到AspNetCore?

mbr*_*brc 12 asp.net asp.net-core

如何将此代码转换为AspNetCore

public static MvcHtmlString ChqLabelFor<TModel, TValue>(this HtmlHelper<TModel> html,
            Expression<Func<TModel, TValue>> expression, object htmlAttributes)
        {
            var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
            string resolvedLabelText = metadata.DisplayName ?? metadata.PropertyName;
            if (metadata.IsRequired)
            {
                resolvedLabelText += "*";
            }
            return LabelExtensions.LabelFor<TModel, TValue>(html, expression, resolvedLabelText, htmlAttributes);
        }
Run Code Online (Sandbox Code Playgroud)

我知道我现在可以使用而MvcHtmlString不仅仅是HtmlString

做什么用

ModelMetadata.FromLambdaExpression
Run Code Online (Sandbox Code Playgroud)

我找不到任何其他选择......

小智 25

那些助手仍然存在,但他们被埋没了一点.

var modelExplorer = ExpressionMetadataProvider.FromLambdaExpression(expression, htmlHelper.ViewData, htmlHelper.MetadataProvider);
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用访问元数据

modelExplorer.Metadata
Run Code Online (Sandbox Code Playgroud)

和模型本身

modelExplorer.Model
Run Code Online (Sandbox Code Playgroud)

我在这里有一些示例代码,用于PowerBI Embedded报表渲染.

https://blogs.endjin.com/2016/09/how-to-use-power-bi-embedded-with-aspnetcore/

  • API 的内部部分现在是真正的内部部分,无法访问。我们应该寻求更好的方法。 (3认同)

Vah*_*eri 13

从@willDaBeast 对另一个答案的评论来看,对我有用的是我作为单独答案提供的以下代码,以实现更好的格式设置。尽管这可能不是推荐的做法。

ModelExpressionProvider expressionProvider = new ModelExpressionProvider(htmlHelper.MetadataProvider);
var metadata = expressionProvider.CreateModelExpression(htmlHelper.ViewData,expression);
Run Code Online (Sandbox Code Playgroud)


som*_*ere 5

在网核 3.0 中:

  1. ModelExpressionProvider从 DI获取实例

  2. 使用CreateModelExpression方法

var metadata = _modelExpressionProvider.CreateModelExpression(ViewData, expression).Metadata;
Run Code Online (Sandbox Code Playgroud)

PS为了扩展HtmlHelper,我建议另一种方法:

 public class CustomHtmlHelper : HtmlHelper, ICustomHtmlHelper 
 {
    // add your extension methods here and in ICustomHtmlHelper
    // _modelExpressionProvider will be part of constructor
    // register implementation in DI
 }
Run Code Online (Sandbox Code Playgroud)

并在视图中使用新的助手:

@inject ICustomHtmlHelper Html
Run Code Online (Sandbox Code Playgroud)

  • 为了在静态方法中获取表达式提供程序,我使用了以下方法: ModelExpressionProvider expressionProvider = new ModelExpressionProvider(htmlHelper.MetadataProvider); var 元数据 = expressionProvider.CreateModelExpression(htmlHelper.ViewData,表达式); (5认同)
  • 您可以尝试 htmlHelper.ViewContext.HttpContext.RequestServices.GetRequiredService&lt;ModelExpressionProvider&gt;(); (4认同)