【问题标题】:Rendering HTML in a data table在数据表中呈现 HTML
【发布时间】:2013-03-22 22:10:39
【问题描述】:

我有一个要呈现到网页的数据表。我想在每一行上显示一个复选框。但是,当我尝试显示它时,它会显示 html。有没有办法解决这个问题?

类定义:

    public int analysisId { get; set; }
    public string heatName { get; set; }
    public DateTime analysisTime { get; set; }
    public string sampleType { get; set; }
    public string grade { get; set; }
    public string productId { get; set; }
    public string element { get; set; }
    public float value { get; set; }

我的模型中的代码如下:

        DataTable GridData = new DataTable();
        GridData.Columns.Add("CheckBoxes");
        GridData.Columns.Add("Analysis ID");
        GridData.Columns.Add("Analysis Time");
        GridData.Columns.Add("Sample Type");
        GridData.Columns.Add("Product ID");

        foreach (var item in elementheaders)
        {
            GridData.Columns.Add(item.Trim());
        }

        int gridend = GridData.Columns.Count;
        int gridrow = 0;//x
        int listrow = 0;//z
        int checknum = 0;

foreach (int analysis in ChemList.Select(d => d.analysisId).Distinct())
{
    DataRow dr = GridData.NewRow();
    GridData.Rows.Add(dr);
    GridData.Rows[gridrow][0] = System.Web.HttpUtility.HtmlDecode("<input type='checkbox' id="+checknum+">");
    GridData.Rows[gridrow][1] = ChemList[listrow].analysisId;
    GridData.Rows[gridrow][2] = ChemList[listrow].analysisTime;
    GridData.Rows[gridrow][3] = ChemList[listrow].sampleType;
    GridData.Rows[gridrow][4] = ChemList[listrow].productId;
}

在我看来:

<div id="grid">
    <table id="example"  class ="gridTable">
        <thead class="gridHead">
            <tr>
                @Html.DisplayFor(x => x.Columns)
            </tr>
        </thead>
        <tbody>
                @Html.DisplayFor(x => x.Rows)
        </tbody>
    </table>
</div>

单元格的显示模板:

@model TheManhattanProject.Models.CellValueViewModel

<td>
    @Html.DisplayFor(x => x.Value)
</td>

行的显示模板:

@model TheManhattanProject.Models.RowViewModel

<tr>
    @Html.DisplayFor(x => x.Values)
</tr>

列的显示模板:

@model TheManhattanProject.Models.ColumnViewModel

<th>
    @Html.DisplayFor(x => x.Name)
</th>

我有两个视图模型来渲染它。每个单元格和行一个。该行由一个单元格值列表组成。

【问题讨论】:

  • 您的问题中的代码是否从您的角度来看?
  • 这是 ASP.NET MVC 吗?此代码在您的视图或控制器中吗?什么是网格数据?请提供有关该问题的更多信息。
  • GridData 是 org.eclipse.swt.layout 的一部分。 01.04?
  • 抱歉,在我的问题中添加了更多代码。这是 ASP.NET MVC
  • 能否也包括您的模型类定义?

标签: c# asp.net-mvc


【解决方案1】:

默认情况下,HTML 助手将对任何字符串进行 HTML 编码。这是一项安全和安保功能。这是一个可能对您有所帮助的答案- Writing/outputting HTML strings unescaped.

【讨论】:

  • 这对我不起作用,因为我不能在 lambda 表达式中使用 Html.Raw()
  • 您不会在视图中使用它,而是在显示模板中使用它。
  • 我之前试过了,报错了。我尝试的方式是 Html.DisplayFor(x => Html.Raw(x.Value))) 不对吗?
  • DisplayFor() 是它转义 HTML 的地方。摆脱它,只需执行@Html.Raw(x.Value)。这是不安全的,因为您绕过了 MVC 中内置的所有安全内容。您应该使用对象列表,而不是使用数据网格。然后,您可以使用@Html.CheckBoxFor()。
  • @Danger_Fox - 如果您确实想使用数据网格,我建议您专门为数据网格单元创建一个 HtmlHelper 扩展。这样,您可以编写代码来检查值和单元格属性,并完全控制发出的 HTML。
【解决方案2】:

您可以为校验码使用自定义的显示模板,该模板不进行 html 编码。

您的 ViewModel 将使用:

GridData.Rows[gridrow][0] = checknum;

显示模板将使用

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Int>" %>

<input type="checkbox" id="@Model" />

【讨论】:

  • 感谢您的帮助。我现在使用三个显示模板来渲染网格。这将如何适应他们?我会用这些更新问题。之前忘记放了。
【解决方案3】:

想出了答案。这是 Matthew 试图告诉我的内容的延伸。

@using System;
@model TheManhattanProject.Models.CellValueViewModel
<td>
@{if(Model.Value.StartsWith("<input type='checkbox'"))
{

    @Html.Raw(Model.Value);

}
else
{

    @Html.DisplayFor(x => x.Value);

}
}
</td>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    相关资源
    最近更新 更多