如何htmlencode体,但不是gridview的标题

时间:2016-04-26 16:20:21

标签: asp.net vb.net gridview

我有一个GridView。我希望单元格的内容,实际的细节数据是html编码的。但我希望将原始HTML保留在标题中。

也就是说,这种情况下的标题是语言名称和ISO代码,例如“英语(EN)”。我希望名称和代码分开,所以我将标题指定为“English< br />(EN)”。

但是对于内容,我希望看到任何HTML。如果它说“< p> foobar< / p>”我想要显示p标签。

如果我说“htmlencode = false”,那么标题不会被编码,但数据也不会被编码。

有什么方法可以说,html编码数据,但不是标题?

如果重要,我会在代码中构建列而不是ASP文件中的标记,具体取决于我在数据中找到的语言。所以这就是我创建列的方式:

For Each row As DataRow In ds.Tables(0).Rows
    Dim iso2 = row("language")
    Dim name = row("name")
    ... other code ...
    Dim head = String.Format("{0}<br/>({1})", name, iso2)
    gvSnippets.Columns.Add(New BoundField With {.HeaderText = head, .DataField = iso2, .HtmlEncode = False})
    ... other code ...
End For

(我的初稿没有设置HtmlEncode。)

好奇的观察:在我的前几次测试运行中,数据不包含任何HTML或实体,标题中的HTML未编码,我得到换行符而不是“&lt; br /&gt;”。然后我做了一个测试,其中数据中有实体,实体得到html编码......标题也是如此。就像ASP一样,显然默认情况下,如果数据没有HTML但标题没有,那么就不要对标题进行HTML编码。但如果数据有HTML,则对数据和标题进行HTML编码。因此,它会动态决定是否对标题进行html编码。

在回复@fnostro时,这是GridView的标记:

<asp:GridView ID="gvSnippets" runat="server" AutoGenerateColumns="False" SkinID="skin3" EmptyDataText="No records found" Visible="false">
</asp:GridView>

没有&lt; Columns&gt;标记。我在代码中完全构建了列。我没有测试是否出现相同的行为,我认为是更正常的情况,你指定带有标记的列。

3 个答案:

答案 0 :(得分:0)

将这些代码行添加到循环的开头

row("language") = HttpUtility.HtmlEncode(dr("language"))
row("name") = HttpUtility.HtmlEncode(dr("name"))

答案 1 :(得分:0)

根据我对您帖子中提供的信息的阅读,我有以下建议:

您应该将数据格式与原始数据隔离开来。

您的 decimal vals = 0.1m; decimal minute = 60m; //both are at the class level private void richTextBox1_TextChanged(object sender, EventArgs e) { //here is where i enabled and started my timer; //i just dragged a timer over my form in the (design) area timer1.Enabled = true; timer1.Start(); list.Add(richTextBox1.Text.ToString());//ignore this line } private void timer1_Tick(object sender, EventArgs e) { //the tick interval is set to 100 //which is 0.1 seconds minute = minute - vals; string aaa = minute.ToString(); label3.Text = aaa; if (minute == 0) { timer1.Stop(); } }是GridView的数据源。 DataTable应该只包含原始数据,完全没有格式化和未掺杂。

DataTable通过设置GridView DataTable并调用DataSource绑定到Gridview。调用DataBind()将触发与Gridviews相关的所有数据绑定事件,这将允许您:

  1. 在aspx标记中的GridView列中管理简单格式和绑定。
  2. 处理特定GridView事件(例如gvSnippets.Databind()事件)背后的代码中更复杂的格式。
  3. 关于GridView标题:RowDataBound一次出现在Gridview的顶部,并且内部存储在HeaderText中,而不是每行存储,即使每个绑定字段都有HeaderText属性。

    示例摘录gvSnippets每个更新的标记:

    GridView.HeaderRow

    然后你可以在Code Behind中做这样的事情:

      <asp:GridView ID="gvSnippets" runat="server" 
        AutoGenerateColumns="False" SkinID="skin3" 
        EmptyDataText="No records found" Visible="false">
      </asp:GridView>
    

    附录处理动态单元格

    对于定义为:

    的GridView
    Public Class __JunkWebForm1
      Inherits System.Web.UI.Page
    
      Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    
        ' Fill Dataset first, then:
        gvSnippets.DataSource = ds.Tables(0)
    
        ' Add Columns...
        gvSnippets.Columns.Add(...)
        gvSnippets.Columns.Add(...)
        gvSnippets.Columns.Add(...)
        . . .
    
        ' This will trigger data binding events
        gvSnippets.DataBind();  
    
      End Sub
    
    
      Private Property HeaderTextLanguage As String
      Private Property HeaderTextLanguageIso As String
      Dim NeedHeaderText As Boolean = False
    
    
      Private Sub gvSnippets_DataBinding(sender As Object, e As EventArgs) Handles gvSnippets.DataBinding
        NeedHeaderText = True
      End Sub
    
      Private Sub gvSnippets_DataBound(sender As Object, e As EventArgs) Handles gvSnippets.DataBound
        Dim this As GridView = sender
    
        this.Columns(0).HeaderText = String.Format("{0}<br>({1})", HeaderTextLanguage, HeaderTextLanguageIso)
      End Sub
    
      Private Sub gvSnippets_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles gvSnippets.RowDataBound
        Dim this As GridView = sender
        Dim drv As DataRowView = e.Row.DataItem
        If e.Row.RowType = DataControlRowType.DataRow Then
          If NeedHeaderText Then
            HeaderTextLanguage = drv("language")
            HeaderTextLanguageIso = drv("iso")
            NeedHeaderText = False
          End If
    
          e.Row.Cells(0).Text = Server.HtmlEncode(drv("Somefieldnameofyours"))
    
        End If
      End Sub
    End Class
    

    我不知道您是如何填充 <asp:GridView ID="gvSnippets" runat="server" AutoGenerateColumns="False"> </asp:GridView> 的,但我使用SqlDataSource来填充Code Behind中的表格。请注意,上面没有GridView ds

    DataSourceID

    然后在Code Behind中,我可以这样做:

      <asp:SqlDataSource ID="SqlDataSource1" runat="server"
        SelectCommand="select top 10 user_id, user_name, user_logon, 'English' as language, 'en' as iso from tbl_users" 
        ConnectionString='<%$ ConnectionStrings:MyConnectionString %>'>
    </asp:SqlDataSource>
    

    现在Gridview动态填充,您仍然可以根据需要处理DataBinding事件期间的所有格式。

答案 2 :(得分:0)

这是我提出的解决方案,适用于我的特定情况。

我正在构建数据以在代码中填充GridView。我创建一个DataTable,向其添加列,然后填充这些列。像:

dim dslang=GetListOfLanguages()
dim dtgv=new DataTable()
for each row as DataRow in dslang.tables(0).rows
  dim language_name=row("name")
  dim language_code=row("code")
  dtgv.columns.add(String.format("{0}<br/>({1})",language_name, language_code)
end for
... bunch of other stuff ...
... inside a loop that reads the data ...
dim outrow=dtgv.NewRow()
... get data for a specific language ...
outrow(language_code)=text
... later ...
my_gridview.datasource=dtgv
my_gridview.databind()

所以我的解决方案:

创建GridView时,设置HtmlEncode = false。这样可以正确显示标题。

填充数据时,请说

outrow(language_code)=HttpUtility.HtmlEncode(text)

所以我将数据添加到数据表中,最终将用作已经编码的gridview的数据源,因此我不需要依赖Gridview对其进行编码。

我认为这是一个平庸的解决方案,因为它只能起作用,因为我从使用代码构建的DataTable填充GridView。如果我直接从标记中指定的DataSource填充GridView,或者从数据库查询创建的DataSet填充GridView,那么放置HttpUtility.HtmlEncode调用就没有方便的地方。