【问题标题】:How can I convert angle-brackets to custom HTML in ASP.NET Core?如何在 ASP.NET Core 中将尖括号转换为自定义 HTML?
【发布时间】:2021-11-01 05:53:19
【问题描述】:

我正在使用 EF 搭建 MVC 以从 SQL Server 数据库中检索数据。我在表中有一个列有<tag> 用于超标/下标;我该如何处理?

数据库中的列值是like

Hc<1> H2<d> T18<c>

但在网络应用程序中,我需要这样显示:

所以我需要将 <sup> 和 > 替换为 &lt;/sup&gt;

<td >
@Html.DisplayFor(modelItem => item.StrainName)
</td>

在索引页中显示该字段之前,如何转义 &lt;tags&gt; 并改为显示超标/下标

我试过了

 @Html.DisplayFor(modelItem => item.StrainName.Replace("<i>", "").Replace("</i>", "").Replace("<sup>", "<").Replace("</sup>", ">"))

但它会抛出类似的错误 nvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions. Microsoft.AspNetCore.Mvc.ViewFeatures.ExpressionMetadataProvider.FromLambdaExpression&lt;TModel, TResult&gt;(Expression&lt;Func&lt;TModel, TResult&gt;&gt; expression, ViewDataDictionary&lt;TModel&gt; viewData, IModelMetadataProvider metadataProvider)

*** 编辑 ***

虽然表格没有使用任何样式

 <div class="col-md-12">
  <table class="table" >
       <thead>
        <tr>
         <th width="10%">
         .......
        </tr>
       </thead>
       <tbody>
         @foreach (var item in Model.Inventorys)
          {
            <tr style="padding-left:2em">
              <td>
               @Html.Raw(item.StrainName.Replace("<", "<sup>").Replace(">", "</sup>")) 
               </td>
               .............
              </tr>
            }
         </tbody>
        </table>

【问题讨论】:

  • @Jazb 我用我尝试过的方法更新了问题
  • “我正在使用 EF 来搭建 MVC”——这是什么意思?!您的问题与实体框架有什么关系?
  • 我想分享的是我没有从头开始构建视图,而是 EF 做到了
  • &lt;1&gt;&lt;d&gt; 不是 HTML 标签,这看起来像是我不熟悉的一些自定义符号,但看起来尖括号中的 everything 意味着上标?

标签: c# razor


【解决方案1】:

所以你的数据库包含这样的文本:

Hc<1> H2<d> T18<c>

你希望它像这样呈现为 HTML:

Hc<sup>1</sup> H2<sup>d</sup> T18<sup>c</sup>

看起来像这样:

Hc1 H2d T18c


然后,在您的 Razor (.cshtml) 文件中执行此操作以获得快速而简单的解决方案:

@Html.Raw( item.StrainName.Replace( "<", "[sup]" ).Replace( ">", "</sup>" ).Replace( "[sup]", "<sup>" ) ) )
  • .Replace 方法一次只替换一个子字符串,所以用"&lt;sup&gt;" 替换&lt; 和用&gt; 替换"&lt;/sup&gt;" 我最初认为需要对.Replace 进行2 次调用。 .
    • 像这样:
      item.StrainName.Replace( "<", "<sup>" ).Replace( ">", "</sup>" )
      
  • ...但是这不起作用,因为第二次调用.Replace 将匹配第一次调用.Replace 添加的&gt; 字符(来自&lt;sup&gt; 中的尾随&gt;
  • 因此需要 3 个单独的 .Replace 调用:
    • 第一次调用使用不同的字符集([])来防止添加第二次调用会匹配的新 &gt; 字符。
    • 第二个正常工作。
    • 第三个调用然后将第一个调用中的&lt;&gt; 替换为[]

您不需要使用DisplayFor 或任何其他___For 方法。 For 方法用于呈现 HTML(一般而言)对应于表单模型的“双向”成员(也称为“数据绑定”)。在这种情况下,这只是对静态 HTML 的简单单向呈现。

更好的方法是根据正则表达式验证文本,以确保尖括号是平衡的,因此不会用不平衡的&lt;sup&gt; 标签破坏您的 HTML(例如,防止无效文本像 @987654349 一样呈现@ - 这是给读者的一个练习。

【讨论】:

  • 我试过 @Html.Raw( item.StrainName.Replace( "&lt;", "&lt;sup&gt;" ).Replace( "&gt;", "&lt;/sup&gt;" ) ) 它删除了 现在显示为 Hc1 H2d T18c 而不是上标
  • @trx 渲染的 HTML 究竟是什么样的? @Html.Raw 本身不应该删除尖括号 - 您可能应用了一个 CSS 规则来删除 &lt;sup&gt; 的上标效果。
  • 我已经更新了我在浏览器中看到的问题以及调试时的问题
  • @trx 谢谢你的截图,但你还没有发布渲染的 HTML 是(即网页的“查看源代码”,而不是它的视觉外观)。我很感激我之前并不清楚。
  • 对不起,我更新了问题。我在呈现的 HTML &lt;sup&gt; 标记中看到但不在表格中。我还添加了我正在使用的表格,我没有在这里做任何样式特殊造型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多