2016-04-26 3 views
0

У меня есть GridView. Я хочу, чтобы содержимое ячеек, данных фактических данных, было html-кодировано. Но я хочу сохранить необработанный HTML в заголовке.Как htmlencode тело, но не заголовок gridview

То есть в заголовке в этом случае указано название языка и код ISO, например «Английский (EN)». Мне нужно указать имя и код на отдельных строках, поэтому я указываю заголовок как «Английский < br/> (EN)».

Но для контента, я хочу видеть любой HTML. Если он говорит «<p> foobar </p >« Я хочу, чтобы отображались p-теги.

Если я скажу «htmlencode = false», заголовок не закодирован, но и данные не будут.

Есть ли способ сказать, html-кодировать данные, но не заголовок?

Если это имеет значение, я строю столбцы в коде, а не теги в файле ASP, в зависимости от того, какие языки я нахожу в своих данных. Так вот, как я создаю столбец: (. Мой первый проект не установлен HTMLEncode)

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 

любопытного наблюдение: В моих первых парах тестовых прогонов, данные не включают в себя какое-либо HTML или сущности и HTML в заголовке НЕ закодированы, я получил разрыв строки, а не «< br/>». Затем я выполнил тест, где в данных были сущности, а сущности получили html-кодирование ... и заголовок тоже. Так что, ASP, по-видимому, говорит, что по умолчанию, если у данных нет HTML, но заголовок делает, то не кодируйте 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> 

Там нет < Столбцы > разметки. Я полностью строю столбцы в коде. Я не проверял, происходит ли такое же поведение в том, что я предполагаю, более нормальный случай, когда вы указываете столбцы с разметкой.

+0

Можете ли вы предоставить разметку 'GridView'' '? – fnostro

ответ

0

Добавьте эти строки кода в начале вашего цикла

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

Хм, как это поможет. «Язык» и «Имя» содержат простой текст, например «Английский» и «EN» или «Испанский» и «ES». HtmlEncode оставит их неизменными. Но этот пост дает мне представление.Я мог бы установить HtmlEncode = false, а затем сделать HttpUtility.HtmlEncode на подробные данные. – Jay

0

Основываясь на моем чтения информации, представленной в вашем посте у меня есть следующие предложения:

Вы должны изолировать данные форматирования из сырой данные.

Ваш DataTable является источником данных для GridView. DataTable должен содержать только необработанные данные, полностью неформатированные и неподданные.

DataTable привязывается к Gridview, установив GridView DataSource и позвонив по телефону DataBind(). Вызов gvSnippets.Databind() будет вызывать все Databinding события, связанные с GridViews, которые позволят Вам:

  1. Manage простое форматирование и связывание в GridView столбцов в ASPX разметки.
  2. Обработайте более сложное форматирование в коде для конкретных событий GridView, таких как событие RowDataBound.

Что касается GridView заголовка: HeaderText появляется один раз в верхней части Gridview и хранится внутри в GridView.HeaderRow, а не на каждый ряд основе, даже если каждая граница поля имеет свойство HeaderText.


Пример выдержки gvSnippets Markup на вашем обновление:

<asp:GridView ID="gvSnippets" runat="server" 
    AutoGenerateColumns="False" SkinID="skin3" 
    EmptyDataText="No records found" Visible="false"> 
    </asp: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 

Добавление Работа с динамическим ячейки

Для GridView определяется как:

<asp:GridView ID="gvSnippets" runat="server" 
    AutoGenerateColumns="False"> 
    </asp:GridView> 

Я не знаю, как вы заселять свой ds, но я использую SqlDataSource заполнить таблицу в код. Обратите внимание, что нет GridView DataSourceID выше:

<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> 

Тогда в код я могу это сделать:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    GetDataSetAndPopulate(gvSnippets) 

    End Sub 

    Private Sub GetDataSetAndPopulate(gv As GridView) 
    Dim view As DataView = SqlDataSource1.Select(DataSourceSelectArguments.Empty) 
    Dim table As DataTable = view.ToTable() 
    Dim ds As DataSet = New DataSet() 
    ds.Tables.Add(table) 

    For Each dc As DataColumn In ds.Tables(0).Columns 
     Dim field As New BoundField 
     field.DataField = dc.ColumnName 
     field.HeaderText = dc.ColumnName 
     gv.Columns.Add(field) 
    Next 

    gv.DataSource = ds 
    gv.DataBind() 

    End Sub 

А теперь Gridview заполняется динамически, и вы все еще можете обрабатывать все форматирование во время DataBinding событий по мере необходимости.

+0

Изменено, чтобы отразить определение Gridview – fnostro

+0

Что-то еще ... если вы знаете, что имена полей будут оставаться неизменными, проще использовать разметку в aspx. Все, что вы делаете, это определение столбцов с ожиданиями будущих данных. Процесс привязки фактически связывает все это вместе. – fnostro

+0

FYI: Я пытался обмануть вопрос до того, что имеет отношение к этому вопросу, но: я строю столбцы в коде, потому что они разные в зависимости от данных. В верхней части экрана отображается раскрывающийся список, в котором пользователь выбирает проект. Для каждого проекта у нас есть данные на одном или нескольких языках, но комбинация языков различна для каждого проекта. Таким образом, для проекта A могут быть столбцы для английского и испанского языков, для проекта B мы можем иметь китайский, корейский и японский языки и т. Д. Для каждого языка может быть много текстовых блоков, поэтому для каждого блока есть столбец и столбец для каждого язык. – Jay

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 = ложь. Это правильно отображает заголовок.

При заполнении данных, скажем

outrow(language_code)=HttpUtility.HtmlEncode(text) 

Так что я добавить данные в DataTable, что в конечном итоге будет использоваться в качестве источника данных для GridView уже закодированного, поэтому мне не нужно полагаться на Gridview кодируя его.

Я считаю это посредственным решением, поскольку он работает только потому, что я заполняю GridView из DataTable, который я строю с кодом. Если я заполнял GridView непосредственно из DataSource, указанного в разметке, или из DataSet, созданного запросом базы данных, не было бы удобного места для вызова HttpUtility.HtmlEncode.

Смежные вопросы