在vb.net/asp中将String转换为Div对象

时间:2013-11-07 13:34:18

标签: html asp.net .net vb.net .net-4.0

我有一个困难的问题,我似乎无法找到解决方法。

基本上,我的数据库上有几个表,通过客户端识别客户端可以访问的ID,使用选项卡

所以我有一个表,通过使用表索引来识别div的ID:

id | id_div
 0 | D0
 1 | D1 (依此类推......)

然后另一个只有客户ID和div(由“id”字段标识)的人可以访问:

client_id | div_id 29 | 0 29 | 1 (依此类推......)

然后我交叉引用哪些div应该是可见的,哪些不应该。 问题是我将divs id作为一个字符串,并且为了能够在代码隐藏中告知将可见性设置为false我需要引用div本身..

样本:

<dx:TabPage Name="tabServico" Text="<%$ Resources:InterfaceGenerica, lblServico %>">
    <ContentCollection>
        <dx:ContentControl>
           <div class="conteudo_pagina_tab">
               <asp:HiddenField ID="hidID" runat="server" Value="0" EnableViewState="true" />
               <asp:HiddenField ID="hidIdCliente" runat="server" Value="0" EnableViewState="true"/>
               <div id="D0" runat="server">
                   <div class="cols coluna1">
                       <asp:Literal ID="litClientes" runat="server" Text="<%$ Resources:InterfaceGenerica, lblCliente %>"></asp:Literal>
                    </div>
                    <div class="cols coluna2-4">
                        <dx:ASPxComboBox ID="cboClientes" runat="server" HelpText="" ValueField="id_cliente" TextField="nome_completo" SelectedValue="" Width="100%" AutoPostBack="true"></dx:ASPxComboBox>
                     </div>
                </div>
                <clear></clear>
                <div id="D1" runat="server">
                     <div class="cols coluna1">
                        <asp:Literal ID="litTipoOperacao" runat="server" Text="<%$ Resources:InterfaceGenerica, lblOperacao %>"></asp:Literal>
                     </div>
                     <div class="cols coluna2-4">
                         <dx:ASPxComboBox ID="cboTipoOperacao" runat="server" Width="100%" HelpText="" ValueField="id_operacoes" TextField="nome" SelectedValue="" AutoPostBack="true">
                          </dx:ASPxComboBox>
                     </div>
                 </div>
                 <clear></clear>
                 <div id="D2" runat="server">
                     <div class="cols coluna1">
                        <asp:Literal ID="litTipoServs" runat="server" Text="<%$ Resources:InterfaceGenerica, lblTipoServico %>"></asp:Literal>
                      </div>
                 <div class="cols coluna2-4">
                     <dx:ASPxComboBox ID="cboTipoServs" runat="server" HelpText="" ValueField="id_tipo_servs" TextField="nome" SelectedValue="" AutoPostBack="true" Width="100%"></dx:ASPxComboBox>
                 </div>
             </div>
             <div id="D3" runat="server">
                   <div class="cols coluna5">
                       <asp:Literal ID="litSubTipoServs" runat="server" Text="<%$ Resources:InterfaceGenerica, lblSubtipoServico %>"></asp:Literal>
                   </div>
                   <div class="cols coluna6-8">
                       <dx:ASPxComboBox ID="cboSubTipoServs" runat="server" HelpText="" ValueField="id_tipo_subtipos" TextField="nome" SelectedValue=""></dx:ASPxComboBox>
                    </div>
               </div>

在代码背后,我有:

Dim cross As New Hashtable()
    Dim divsCliente() As String

    Dim lstDivs As List(Of campos_agd_form)
    lstDivs = campos_agd_form_mapper.CarregarDivs()

    If lstDivs IsNot Nothing Then
        For Each i In lstDivs
            cross.Add(i.id, i.id_div)
        Next
    End If

    Dim lstDivsCliente As List(Of clientes_campos_agd)
    lstDivsCliente = clientes_campos_agd_mapper.CarregarCamposCliente(guser.id)

    If lstDivsCliente IsNot Nothing Then
        divsCliente = (lstDivsCliente.Item(0).id_campos_enum).Split(",")
    End If
    'Dim divsCliente() As Integer = Convert.ToInt32((lstDivsCliente.id_divs).Split(","))

    For Each item In cross
        For Each i In divsCliente
            If item.Key = Convert.ToInt32(i) Then
                Dim div As System.Web.UI.HtmlControls.HtmlGenericControl
                div = TryCast(item.Value, System.Web.UI.HtmlControls.HtmlGenericControl)
                div.Visible = False
            End If
        Next
    Next

正如我已经预料到我无法将字符串转换为HtmlObject所以我需要做的是通过它的id(字符串)找到一个对象,而不必通过父对象(基本上,搜索整个文档,就像使用带有getElementById的javascript一样)

如何实现这一目标?

我使用的框架是.NET 4.0

2 个答案:

答案 0 :(得分:1)

我推荐以下方法。

您需要知道要向每个用户显示哪些信息,因此您可能希望将其存储在会话中,例如(Global.asax):

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
    ' Fetch from DB
    Session("Rights") = {"MyID1", "MyID3"}
End Sub

然后创建一个基本用户控件,从会话中检查它的id是否在用户拥有的权限列表中。如果没有,控件将自动隐藏它:

Imports System.Linq

Public MustInherit Class MyBaseControl
    Inherits System.Web.UI.UserControl

    Private Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init
        If Page.IsPostBack Then Return

        Dim rights As String() = CType(Session("Rights"), String())
        If Not rights.Any((Function(s) s = Me.ID)) Then Me.Visible = False
    End Sub
End Class

然后创建从该基本控件继承的x个内容控件。这些控件可能具有完全不同的内容,但考虑尽可能少,因为您的D0,D1等似乎具有几乎相同的内容。因此,只需自定义控件即可处理不同的文本和值:

Public Class MyControl1
    Inherits MyBaseControl
End Class

然后在页面上,您将根据需要拥有尽可能多的控件:

<div>
    <uc1:MyControl1 ID="MyID1" runat="server" />
    <uc2:MyControl2 ID="MyID2" runat="server" />
    <uc3:MyControl3 ID="MyID3" runat="server" />
</div>

希望这有帮助。

答案 1 :(得分:1)

所以,我最终做的事情有所不同。

基本上我正在使用ClientScriptManager,并构造一个包含要隐藏的元素的数组。 (然后将其传递给客户端)。

所以这个功能现在看起来像这样:

Private Sub ManipulaFormCliente()
    Dim cross As New Hashtable()
    Dim divsCliente() As String = New String() {}
    Dim aux() As String = New String() {}
    Dim cs As ClientScriptManager = Page.ClientScript

    Dim lstDivs As List(Of campos_agd_form)
    lstDivs = campos_agd_form_mapper.CarregarDivs()

    If lstDivs IsNot Nothing Then
        For Each i In lstDivs
            cross.Add(i.id, i.id_div)
        Next
    End If

    Dim lstDivsCliente As List(Of clientes_campos_agd)
    lstDivsCliente = clientes_campos_agd_mapper.CarregarCamposCliente(" id_cliente = " & Convert.ToInt32(hidIdCliente.Value))

    If lstDivsCliente IsNot Nothing Then
        If lstDivsCliente.Count <> 0 Then
            divsCliente = (lstDivsCliente.Item(0).id_campos_enum).Split(",")
        End If
    End If

    For Each item In cross
        For Each i In divsCliente
            If item.Key = Convert.ToInt32(i) Then
                cs.RegisterArrayDeclaration("divsCliente", "'" & item.Value & "'")
            End If
        Next
    Next
End Sub

然后,在客户端,我创建了一个在窗口加载后运行的函数,并使用在代码隐藏中构造的数组在其ID在数组上传递的div上应用css“display:none”。

代码如下:

window.onload = function hideFields() {
        if (divsCliente.length > 0) {
            for (var i = 0; i < divsCliente.length; i++) {
                document.getElementById(divsCliente[i]).style.display = 'none';
            }
        }
    }

这实现了所需的行为:只要有回发(和相应的加载),就会运行此函数,隐藏所需的div / fields。

最后一点,我不得不在div中添加'clientidmode =“static”'属性,以使getElementById()函数正常工作(根据数据库中的数据)

我希望这有助于任何需要类似解决方案的人。