【问题标题】:Asp.NET MvcHtmlString and ModelMetadata.FromLambdaExpression to AspNetCore?Asp.NET MvcHtmlString 和 ModelMetadata.FromLambdaExpression 到 AspNetCore?
【发布时间】:2016-07-28 19:27:33
【问题描述】:

如何将此代码转换为 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

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

【问题讨论】:

  • 您的标题具有误导性,因为它与您实际提出的问题无关
  • 我编辑了标题

标签: asp.net asp.net-core


【解决方案1】:

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

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

然后您可以使用

访问元数据
modelExplorer.Metadata

和模型本身

modelExplorer.Model

我这里有一些示例代码用于 PowerBI Embedded 报表呈现。

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

【讨论】:

  • API 的内部部分现在是真正的内部,无法访问。我们应该寻求更好的方法。
【解决方案2】:

在 netcore 3.0 中:

  1. 从 DI 中获取ModelExpressionProvider 的实例

  2. 使用CreateModelExpression方法

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

附言 为了扩展 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

【讨论】:

  • 所以在 ASP.NET MVC 项目中,我会在像 HtmlExtensions.cs 这样的类中创建一个静态方法,我会从 EditorTemplate 调用它。由于我需要访问依赖注入,我是否应该考虑使用 ViewComponent(因为我可以在那里使用构造函数注入)?
  • 你可以试试 htmlHelper.ViewContext.HttpContext.RequestServices.GetRequiredService();
  • 在我的示例中,不需要使用 ViewComponent 来代替 View。 @inject 将与 View 一起使用。
  • 为了在静态方法中获取表达式提供程序,我使用了这个:ModelExpressionProvider expressionProvider = new ModelExpressionProvider(htmlHelper.MetadataProvider); var metadata = expressionProvider.CreateModelExpression(htmlHelper.ViewData,expression);
  • @willDaBeast 虽然这显然不是推荐的方法,但这实际上是我的答案。还是不能习惯摆脱这些静态扩展方法。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多