0

ちょっと難しい問題があり、解決方法がわからないようです。

基本的に、データベースにはいくつかのテーブルがあり、タブを使用して、クライアントがアクセスできるdiv IDをクライアントごとに識別します

したがって、テーブル インデックスを使用して、ID で div を識別するテーブルがあります。

ID | id_div
0 | D0
1 | D1 (など)

そして、彼がアクセスできるクライアント ID と div (「id」フィールドで識別される) のみを持つ別のもの:

client_id | div_id 29 | 0 29 | 1 (など)

次に、どの div を表示し、どの div を表示しないかを相互参照しています。問題は、div 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です

4

2 に答える 2

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>

お役に立てれば。

于 2013-11-08T06:58:16.077 に答える
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/フィールドが非表示になります。

最後の仕上げとして、(DB のデータによると) getElementById() 関数を適切に動作させるために、「clientidmode = "static"」属性を div に追加する必要がありました。

これが、同様の解決策を必要としている人に役立つことを願っています。

于 2013-11-08T16:11:38.857 に答える