Asp.NET MvcHtmlString和ModelMetadata.FromLambdaExpression到AspNetCore?

时间:2016-07-28 19:27:34

标签: 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);
        }

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

如何处理

ModelMetadata.FromLambdaExpression

我找不到任何替代方案......

3 个答案:

答案 0 :(得分:22)

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

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

然后,您可以使用

访问元数据
modelExplorer.Metadata

和模型本身

modelExplorer.Model

我在这里有一些示例代码,用于PowerBI嵌入式报表呈现。

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

答案 1 :(得分:5)

在netcore 3.0中:

  1. 从DI获取ModelExpressionProvider的实例

  2. 使用CreateModelExpression方法

var metadata = _modelExpressionProvider.CreateModelExpression(ViewData, expression).Metadata;

P.S 为了扩展HtmlHelper,我建议另一种方法:

 public class CustomHtmlHelper : HtmlHelper, ICustomHtmlHelper 
 {
    // add your extension methods here and in ICustomHtmlHelper
    // _modelExpressionProvider will be part of constructor
    // register implementation in DI
 }

并在视图中使用新的帮助器:

@inject ICustomHtmlHelper Html

答案 2 :(得分:0)

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

ModelExpressionProvider expressionProvider = new ModelExpressionProvider(htmlHelper.MetadataProvider);
var metadata = expressionProvider.CreateModelExpression(htmlHelper.ViewData,expression);