ASP.NET Core 6 MVC 中的 MvcHtmlString

MvcHtmlString in ASP.NET Core 6 MVC

提问人:csharpdev 提问时间:4/7/2023 更新时间:4/7/2023 访问量:327

问:

我正在将应用程序从在 .NET 4.8 上运行的 ASP.NET MVC 5 迁移到 ASP.NET Core 6 MVC。

MVC 5 应用程序具有以下功能:

 public static MvcHtmlString BuildColoredIconTag(string iconName, string color)
 {
    var icon = BuildInternalColoredIconTag(iconName, color);

    var htmlBuilder = new StringBuilder();

    htmlBuilder.Append(icon);

    var finalHtml = icon.ToString(TagRenderMode.Normal);

    return MvcHtmlString.Create(finalHtml);
}

我在新应用程序中将其更新为以下内容:

public static HtmlString BuildColoredIconTag(string iconName, string color)
{
    var icon = BuildInternalColoredIconTag(iconName, color);

    var htmlBuilder = new StringBuilder();

    htmlBuilder.Append(icon);

    var finalHtml = icon.TagRenderMode.ToString();

    return new HtmlString(finalHtml);
}

这是正确的还是我应该将其更新为其他内容?我还不能测试它,因为我正在添加其他组件。

我在部分 .cshtml 文件中包含以下内容,但我收到空引用警告:

@IconExtensions.BuildColoredIconTag(ViewData["icon"].ToString(), "text-info")

我应该把它更新到什么?

C# ASP.NET-CORE-MVC nullreferenceexception

评论


答:

0赞 mxmissile 4/7/2023 #1

如果你不想删除 VS 中新的可为 null 的东西,你可以做这样的事情纯粹作为一个例子,我也会将其转换为扩展:

public static IHtmlString BuildColoredIconTag(this IHtmlHelper helper, string? iconName, string? color)
{
    if(string.IsNullOrEmpty(iconName)) return HtmlString.Empty;  // or throw

    if(string.IsNullOrEmpty(color)) return HtmlString.Empty; // or throw

    var icon = BuildInternalColoredIconTag(iconName, color);

    var htmlBuilder = new StringBuilder();

    htmlBuilder.Append(icon);

    var finalHtml = icon.TagRenderMode.ToString();

    return new HtmlString(finalHtml);
}

然后调用类似:

@Html.BuildColoredIconTag(ViewData["icon"].ToString(), "text-info")

为了进一步简化操作,您可以将方法的签名更改为:

public static IHtmlString BuildColoredIconTag(this IHtmlHelper helper, object? iconName, string? color)
{
  if(iconName == null) {  return HtmlString.Empty; }
  
  ...

然后打电话@Html.BuildColoredIconTag(ViewData["icon"], "text-info")

1赞 Ruikai Feng 4/7/2023 #2

这是由 csproj 文件中的这一行引起的

<Nullable>enable</Nullable>

文档中所述:

默认情况下,可为 null 的注释和警告上下文处于禁用状态。 这意味着您现有的代码无需更改即可编译,并且 而不生成任何新警告。从 .NET 6 开始,新增 项目包括 enable 元素 项目模板。

如果你不喜欢它,就禁用它

<Nullable>disable</Nullable>

如果您想在没有警告的情况下保留它,请清除iconName或尝试使用操作器string???

喜欢:

ViewData["icon"]?.ToString()??"DefaultIcon"