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的主要内容,如果未能解决你的问题,请参考以下文章