将 @Html.Label 从 ASP.NET MVC 5 迁移到 ASP.NET Core 7.0

Migrating @Html.Label from ASP.NET MVC 5 to ASP.NET Core 7.0

提问人:Pinte Dani 提问时间:9/15/2023 最后编辑:Qing GuoPinte Dani 更新时间:9/15/2023 访问量:89

问:

我正在将 ASP.NET MVC 5 应用程序迁移到 ASP.NET Core 7.0。

迁移后,我现在收到编译器错误,代码如下:

@Html.Label("My Label", new { @class = "mt-4 mb-2" })

我在代码中使用了很多,似乎在 .NET Core 中为此帮助程序引入了一个新参数:@Html.Label

IHtmlContent Label(string expression, string labelText, object htmlAttributes);

似乎不再有重载,它只接受两个参数,就像 ASP.NET MVC 5 (labelText + htmlAttributes)一样。

我想我必须用“表达式”参数更新所有这些,或者有其他解决方案吗?

c# asp.net-core-tag-helpers

评论

1赞 Qing Guo 9/15/2023
您是否想要像 : 这样的 HTML 标记?<label class="mt-4 mb-2" asp-for="item_Value">My Label</label>
0赞 Pinte Dani 9/15/2023
是的,这将是一个选择,但是在 400+ 个地方这样做并不那么方便。也许有一个更快的解决方案
0赞 Panagiotis Kanavos 9/15/2023
您已经需要更改 4000 个位置。ASP.NET Core 是一个完全不同的堆栈。不仅这些帮助程序消失了,而且不再有 HttpContext.Current,整个管道也完全不同。
0赞 Panagiotis Kanavos 9/15/2023
您正在尝试在应用程序中进行 7 年的跳跃 - ASP.NET Core 1 于 2016 年发布。我建议使用 .NET 迁移助手来找出可以自动更改的内容和需要手动更改的内容,然后根据链接的迁移指南遵循谨慎的迁移策略。如果尝试重新创建旧标记,则将花费大量时间,并且仍然保留在 MVC 5 ASP.NET 中,这次没有工具支持
0赞 Pinte Dani 9/15/2023
@PanagiotisKanavos 帮助程序没有消失,只是添加了一个新参数。可能将新参数添加为 string.empty 就足以快速解决问题。

答:

2赞 Jalpesh Vadgama 9/15/2023 #1

我总是建议使用 Label Tag Helper。您可以像下面这样使用它。

<label asp-for="My Label"></label>

这是最简单的部分。

评论

1赞 Panagiotis Kanavos 9/15/2023
这是唯一可行的解决方案。ASP.NET Core 是一个完全不同的堆栈。不同的标签是变化最小的。管道、控制器、视图、样式、身份验证都是不同的 - 没关系 HttpContext.Current
0赞 Panagiotis Kanavos 9/15/2023
此外,复制旧标签意味着项目在经过大量工作后仍将处于相同的状态(如果不是更糟的话),但这次没有 Migration Assistant 能够处理它。实际上,迁移将在未来需要更多的工作
0赞 Pinte Dani 9/15/2023
我想你的意思是<label class=“mt-4 mb-2”>My Label</label>
0赞 Yehor Androsov 9/15/2023 #2

您可以尝试创建自己的静态扩展方法,该方法将复制旧 Label 方法的签名

public static class HtmlExtensions 
{
    public static IHtmlContent Label(this IHtmlHelper helper, string expression, object htmlAttributes = null)
    {
        return helper.Label(expression, expression, htmlAttributes);
    }
}
-1赞 Qing Guo 9/15/2023 #3

我想我必须用“表达式”参数更新所有这些, 还是有其他解决方案?

另一种解决方案:您可以使用扩展方法创建HTML助手,例如:

LabelExtensions:

public static class LabelExtensions
 {
     public static Microsoft.AspNetCore.Html.IHtmlContent Label(this Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper htmlHelper, string labelText, object htmlAttributes)
     {
         var str = String.Format("<label for='{0}'>{1}</label>", htmlAttributes, labelText);
         return new HtmlString(str);

     }
 }

创建扩展方法并成功生成应用程序后,该扩展方法将像类的所有其他方法一样显示在 Visual Studio Intellisense 中。

结果:

enter image description here

enter image description here

评论

0赞 Panagiotis Kanavos 9/15/2023
这根本行不通。这两个框架中的 Label 帮助程序所做的不仅仅是调用 .此外,使用匿名类型参数进行调用只会打印类型的内部名称String.FormatString.Format
0赞 Qing Guo 9/20/2023
@PanagiotisKanavos是的,你是对的,这两个框架中的 Label 帮助程序所做的不仅仅是调用 String.Format。首先我发表评论,建议使用 op,但他认为在 400+ 个地方这样做不是那么方便,然后我给了 op 选项。当然更好。<label class="mt-4 mb-2" asp-for="item_Value"><label>
0赞 Pinte Dani 9/15/2023 #4

似乎有多种解决方案可以解决此问题,在这种情况下,更简洁的解决方案是直接使用标签:

<label></label>

但作为快速修复,通过对代码进行微小的更改,我设法将 string.empty(“”) 作为参数传递:

@Html.Label("", "My Label", new { @class = "mt-4 mb-2" })

这将呈现标签,但由于第一个参数为空,我们得到这个 生成

enter image description here

总而言之,在这种情况下,我将直接将该标记用于新代码,并且仅当有要绑定的表达式时才应使用该标记。<label>@Html.Label

可能正是由于这个原因,在 ASP.NET Core 中,该重载被删除了。

评论

0赞 Panagiotis Kanavos 9/15/2023
不,它没有被移除——它甚至不是过载。您正在对完全不同的类调用完全不同的方法。
0赞 Pinte Dani 9/15/2023
@PanagiotisKanavos我知道 asp.net 核心有一个全新的基础设施,我同意,这很清楚。但是许多 HTML 助手具有完全相同的签名,以使迁移更容易,其中一些已被更改/删除。这就是我想提到的