Html 在vb.net/asp中将字符串转换为Div对象

Html 在vb.net/asp中将字符串转换为Div对象,html,asp.net,.net,vb.net,.net-4.0,Html,Asp.net,.net,Vb.net,.net 4.0,我有一个难题,似乎找不到解决办法 基本上,我的数据库上有两个表,它们通过客户机标识客户机可以访问的divs id,通过使用选项卡 因此,我有一个表,通过使用表索引,通过其ID标识div: id| id_div 0 | D0 1 | D1 (等等) 然后是另一个只有客户ID和DIV(由“ID”字段标识)的用户,他可以访问: 客户id |部门id 29 | 0 29 | 1 (等等) 然后我交叉引用哪些div应该可见,哪些不应该可见。 问题是,我将divs id作为字符串获取,为了能够在代码中告诉您

我有一个难题,似乎找不到解决办法

基本上,我的数据库上有两个表,它们通过客户机标识客户机可以访问的divs id,通过使用选项卡

因此,我有一个表,通过使用表索引,通过其ID标识div:

id| id_div
0 | D0
1 | D1 (等等)

然后是另一个只有客户ID和DIV(由“ID”字段标识)的用户,他可以访问:

客户id |部门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>
正如我所期待的,我无法将字符串转换为HtmlObject,因此我需要做的是通过它的id(字符串)查找对象,而不必遍历父对象(基本上,搜索整个文档,就像使用带有getElementById的javascript一样)

如何做到这一点


我使用的框架是.NET4.0,我推荐以下方法

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

然后创建一个基本用户控件,该控件从会话中检查其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>


希望这能有所帮助。

所以,我最终做了一些不同的事情

基本上,我使用的是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
Private-Sub-ManipulaFormCliente()
Dim cross作为新哈希表()
Dim divsCliente()作为字符串=新字符串(){}
Dim aux()作为字符串=新字符串(){}
Dim cs As ClientScriptManager=Page.ClientScript
Dim lstDivs As列表(campos_agd_表格)
lstDivs=campos\u agd\u form\u mapper.CarregarDivs()
如果lstDivs不是什么,那么
对于lstDivs中的每个i
交叉添加(i.id,i.id\u div)
下一个
如果结束
Dim LSTDivsclient作为列表(客户)
lstdivsclient=clientes\u campos\u agd\u mapper.carregarcomposlient(“id\u cliente=“&Convert.ToInt32(hidIdCliente.Value))
如果lstDivsCliente不是空的,那么
如果lstdivsclient.Count为0,则
divsCliente=(lstDivsCliente.Item(0).id\u campos\u enum.Split(“,”)
如果结束
如果结束
对于交叉中的每个项目
每一个我都在离婚
如果item.Key=Convert.ToInt32(i),则
cs.RegisterArrayDeclaration(“divsclient”、“item.Value&“”))
如果结束
下一个
下一个
端接头
然后,在客户端,我创建了一个函数,该函数在加载窗口后运行,并使用基于代码隐藏构建的数组对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';
            }
        }
    }
window.onload=函数hideFields(){
如果(divsCliente.length>0){
对于(变量i=0;i
这实现了所需的行为:每当有回发(和相应的加载)时,都会运行此函数,隐藏所需的div/字段

最后,为了让getElementById()函数正常工作(根据数据库中的数据),我必须将“clientMode=“static”属性添加到divs中


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

您是否尝试过为您的div添加父div(即runat=“server”),并使用它来查找具有特定id的div?即parentDiv.FindControl(“D0”)?这将要求我在我相信的整个页面中添加一个parentDiv。。我已经用一个更完整的示例更新了我的aspx代码,而不仅仅是一个div。这似乎是一种可能的方法,但我最终使用了另一种方法,我将在稍后发布,如果启用了javascript,这种方法是有效的。但是请记住,您正在生成大量不需要的多余html。如果不需要html,那么首先不应该生成它。用户还可以轻松修改字段,因为它们位于html中(仅隐藏),因此可能会产生安全问题。如果用户确实不能修改这些字段,那么它们就不应该出现在html中。我完全清楚这种情况。但是额外的div确实是必要的(因为我不想让控件消失),而且这个应用程序中的用户(非常具体的内联网内容)在技术问题上通常太笨,所以这个解决方案工作正常,尽管它并不理想
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
window.onload = function hideFields() {
        if (divsCliente.length > 0) {
            for (var i = 0; i < divsCliente.length; i++) {
                document.getElementById(divsCliente[i]).style.display = 'none';
            }
        }
    }