ASP.NET Core ToHtmlString

Posted

技术标签:

【中文标题】ASP.NET Core ToHtmlString【英文标题】: 【发布时间】:2018-11-25 10:26:10 【问题描述】:

我有以下 Kendo UI 网格,我需要为详细信息页面呈现操作链接:

@(html.Kendo().Grid<Model>()
  .Name("grid")
  .Columns(columns =>
  
      columns.Bound(c => c.Id).Hidden(true);

      @* Invalid line of code as ClientTemplate is waiting for a string *@
      columns.Bound(c => c.Name).ClientTemplate(Html.ActionLink("#=Name#", "Details", new  id = "#=Id#" ));
      @* Invalid line of code as ClientTemplate is waiting for a string *@

      columns.Bound(c => c.Type).Width(100);
      columns.Bound(c => c.Subdomain).Width(150);
      columns.Bound(c => c.Description);
      columns.Bound(c => c.Status).Width(100);
      columns.Select().Width(50);
  )
  .AutoBind(false)
  .Scrollable()
  .Pageable(pageable => pageable
      .Refresh(false)
      .PageSizes(true)
      .ButtonCount(5))
  .DataSource(dataSource => dataSource
      .Ajax()
      .Read(read => read.Action("Read", "Data"))
      .PageSize(5)).Deferred())

ClientTemplate 方法需要一个 html 字符串。

columns.Bound(c => c.Name).ClientTemplate(string template) 

在 .NET Core 之前,您将按以下方式处理此请求:

  columns.Bound(c => c.Name).ClientTemplate(Html.ActionLink("#=Name#", "Details", new  id = "#=Id#" ).ToHtmlString());

很遗憾,.ToHtmlString() (https://msdn.microsoft.com/en-us/library/system.web.htmlstring.tohtmlstring(v=vs.110).aspx) 是 System.Web dll 的一部分。

我们如何在 .NET Core 中处理这个问题?

【问题讨论】:

你试过 System.Net.WebUtility.HtmlEncode(string) 和 System.Net.WebUtility.HtmlDecode(string)。 .ActionLink() 返回一个IHtmlContent。我需要一种将 IHtmlContent 转换为 html 字符串的方法。 【参考方案1】:

我最终为IHtmlContent 创建了一个扩展方法:

public static class HtmlContentExtensions

    public static string ToHtmlString(this IHtmlContent htmlContent)
    
        if (htmlContent is HtmlString htmlString)
        
            return htmlString.Value;
        

        using (var writer = new StringWriter())
        
            htmlContent.WriteTo(writer, System.Text.Encodings.Web.HtmlEncoder.Default);
            return writer.ToString();
        
    

我在我的剑道 UI 网格中以下列方式使用它:

columns.Bound(c => c.Name).ClientTemplate(Html.ActionLink("#=Name#", "Details", new  id = "#=Id#" ).ToHtmlString());

【讨论】:

如果 IHtmlContent 是 HtmlString 的实例,则只需获取 value 属性即可。所以在我的这个扩展方法的版本中,我在使用之前添加了这个: if (htmlContent is HtmlString htmlString) return htmlString.Value;

以上是关于ASP.NET Core ToHtmlString的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net core (Full .Net framework) vs Asp.Net core (.Net Core) 性能

Asp.NET Core进阶 第四篇 Asp.Net Core Blazor框架

.NET Core 1.0ASP.NET Core 1.0和EF Core 1.0简介

asp.net core 注入后仍然报错?

深入研究 Mini ASP.NET Core(迷你 ASP.NET Core),看看 ASP.NET Core 内部到底是如何运行的

.Net Core 学习 - ASP.NET Core 概念学习