提问人:Pinte Dani 提问时间:9/15/2023 最后编辑:Qing GuoPinte Dani 更新时间:9/15/2023 访问量:89
将 @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
问:
我正在将 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)一样。
我想我必须用“表达式”参数更新所有这些,或者有其他解决方案吗?
答:
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 中。
结果:
评论
0赞
Panagiotis Kanavos
9/15/2023
这根本行不通。这两个框架中的 Label 帮助程序所做的不仅仅是调用 .此外,使用匿名类型参数进行调用只会打印类型的内部名称String.Format
String.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" })
这将呈现标签,但由于第一个参数为空,我们得到这个 生成:
总而言之,在这种情况下,我将直接将该标记用于新代码,并且仅当有要绑定的表达式时才应使用该标记。<label>
@Html.Label
可能正是由于这个原因,在 ASP.NET Core 中,该重载被删除了。
评论
0赞
Panagiotis Kanavos
9/15/2023
不,它没有被移除——它甚至不是过载。您正在对完全不同的类调用完全不同的方法。
0赞
Pinte Dani
9/15/2023
@PanagiotisKanavos我知道 asp.net 核心有一个全新的基础设施,我同意,这很清楚。但是许多 HTML 助手具有完全相同的签名,以使迁移更容易,其中一些已被更改/删除。这就是我想提到的
评论
<label class="mt-4 mb-2" asp-for="item_Value">My Label</label>