Pagina que hereda clase

Iniciado por d91, 27 Septiembre 2015, 03:29 AM

0 Miembros y 2 Visitantes están viendo este tema.

d91

hola a todos estoy tratando de implementar user control, pero hice una clase llamada pagina base, donde cada vez que se cargue una pagina se verifiquen variables de session para cargar el user control, pero la pagina por defecto hereda de system.web.ui.page y no hay herencia multiple en visual basic, por lo que necesito que esta pagina herede la clase pagina_base, pero si quito lo que hereda por defecto la pagina no funciona, agradezco sus comentarios
Código (vbnet) [Seleccionar]

Public Class inciso3
    Inherits System.Web.UI.Page

Eleкtro

#1
Explica con más detalle el tipo de modelo que pretendes diseñar.

Yo entendí, probablemente mal, que necesitas esta estructura, donde la herencia múltiple no es necesaria:

Código (vbnet) [Seleccionar]
Public Class UserCtrl : Inherits System.Web.UI.UserControl

End Class

Public Class PaginaBase : Inherits System.Web.UI.Page

   Public Sub New()
   End Sub

End Class

Public NotInheritable Class Inciso3 : Inherits PaginaBase

End Class


Muestra un ejemplo más extenso como el de arriba, ya que no queda claro donde ves necesario aplicar una herencia múltiple.




Tomando el ejemplo de arriba, si el problema es que necesitas heredar UserCtrl y PaginaBase en una misma class, entonces una alternativa sería crear una instancia de ambas classes en el constructor de otra class.

Obviamente esto no te permitiria reemplazar, añadir y/o anular miembros ya que no existe una herencia, pero tampoco se si necesitas hacer eso.

Código (vbnet) [Seleccionar]
Public NotInheritable Class Multi

   Public ReadOnly Property UserCtrl As UserCtrl
       Get
           Return Me.userCtrlB
       End Get
   End Property
   Private userCtrlB As UserCtrl

   Public ReadOnly Property PaginaBase As PaginaBase
       Get
           Return Me.paginaBaseB
       End Get
   End Property
   Private paginaBaseB As PaginaBase

   Public Sub New()
       Me.userCtrlB = New UserCtrl
       Me.paginaBaseB = New PaginaBase
   End Sub

End Class





De todas formas, una herencia múltiple la podrías simular implementando múltiples interfaces, pero esto requiere un mayor trabajo.

Sabiendo esto:
https://msdn.microsoft.com/en-us/library/system.web.ui.page%28v=vs.110%29.aspx
System.Web.UI.Page:
   Inherits   TemplateControl
   Implements IHttpHandler

https://msdn.microsoft.com/en-us/library/system.web.ui.templatecontrol%28v=vs.110%29.aspx
System.Web.UI.TemplateControl
   Inherits   Control
   Implements INamingContainer,
              IFilterResolutionService

https://msdn.microsoft.com/en-us/library/system.web.ui.control%28v=vs.110%29.aspx
System.Web.UI.Control
   Implements IComponent,
              IDisposable,
              IParserAccessor,
              IUrlResolutionService,
              IDataBindingsAccessor,
              IControlBuilderAccessor,
              IControlDesignerAccessor,
              IExpressionsAccessor


Podemos empezar por llevar a cabo algo como esto:
Código (vbnet) [Seleccionar]
Public Class TestClass
   Inherits Otraclass
   Implements System.IDisposable,
              System.ComponentModel.IComponent,
              System.Web.IHttpHandler,
              System.Web.UI.IControlBuilderAccessor,
              System.Web.UI.IControlDesignerAccessor,
              System.Web.UI.IDataBindingsAccessor,
              System.Web.UI.IExpressionsAccessor,
              System.Web.UI.IFilterResolutionService,
              System.Web.UI.INamingContainer,
              System.Web.UI.IParserAccessor,
              System.Web.UI.IUrlResolutionService

   Public Event Disposed(sender As Object, e As EventArgs) Implements IComponent.Disposed

   Public Property Site As ISite Implements IComponent.Site

   Public ReadOnly Property DataBindings As Web.UI.DataBindingCollection Implements Web.UI.IDataBindingsAccessor.DataBindings
       Get
       End Get
   End Property

   Public ReadOnly Property HasDataBindings As Boolean Implements Web.UI.IDataBindingsAccessor.HasDataBindings
       Get
       End Get
   End Property

   Public ReadOnly Property ControlBuilder As Web.UI.ControlBuilder Implements Web.UI.IControlBuilderAccessor.ControlBuilder
       Get
       End Get
   End Property

   Public ReadOnly Property UserData As IDictionary Implements Web.UI.IControlDesignerAccessor.UserData
       Get
       End Get
   End Property

   Public ReadOnly Property Expressions As Web.UI.ExpressionBindingCollection Implements Web.UI.IExpressionsAccessor.Expressions
       Get
       End Get
   End Property

   Public ReadOnly Property HasExpressions As Boolean Implements Web.UI.IExpressionsAccessor.HasExpressions
       Get
       End Get
   End Property

   Public Sub New()
   End Sub

   Public ReadOnly Property IsReusable As Boolean Implements Web.IHttpHandler.IsReusable
       Get
       End Get
   End Property

   Public Sub ProcessRequest(context As Web.HttpContext) Implements Web.IHttpHandler.ProcessRequest
   End Sub

   Public Function CompareFilters(filter1 As String, filter2 As String) As Integer Implements Web.UI.IFilterResolutionService.CompareFilters
   End Function

   Public Function EvaluateFilter(filterName As String) As Boolean Implements Web.UI.IFilterResolutionService.EvaluateFilter
   End Function

   Public Sub AddParsedSubObject(obj As Object) Implements Web.UI.IParserAccessor.AddParsedSubObject
   End Sub

   Public Function ResolveClientUrl(relativeUrl As String) As String Implements Web.UI.IUrlResolutionService.ResolveClientUrl
   End Function

   Public Function GetDesignModeState() As IDictionary Implements Web.UI.IControlDesignerAccessor.GetDesignModeState
   End Function

   Public Sub SetDesignModeState(data As IDictionary) Implements Web.UI.IControlDesignerAccessor.SetDesignModeState
   End Sub

   Public Sub SetOwnerControl(owner As Web.UI.Control) Implements Web.UI.IControlDesignerAccessor.SetOwnerControl
   End Sub

#Region "IDisposable Support"
   Private disposedValue As Boolean ' To detect redundant calls

   ' IDisposable
   Protected Overridable Sub Dispose(disposing As Boolean)
       If Not Me.disposedValue Then
           If disposing Then
               ' TODO: dispose managed state (managed objects).
           End If

           ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
           ' TODO: set large fields to null.
       End If
       Me.disposedValue = True
   End Sub

   ' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources.
   'Protected Overrides Sub Finalize()
   '    ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
   '    Dispose(False)
   '    MyBase.Finalize()
   'End Sub

   ' This code added by Visual Basic to correctly implement the disposable pattern.
   Public Sub Dispose() Implements IDisposable.Dispose
       ' Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
       Dispose(True)
       GC.SuppressFinalize(Me)
   End Sub
#End Region

End Class


Saludos








d91

#2
Gracias desde ya, aqui un poco mas de codigo, en el user control tengo el menu, y quiero que se deshabiliten los links cuando no este logueado, para eso hice la clase pagina_base, pero al crear un nuevo aspx el code behind herede automaticamente de la clase system.web.ui.page y trato de sobreescribir el page_load de modo que siempre verifique el   login en la clase:
Código (vbnet) [Seleccionar]

Imports Businness
Imports Modelo
Public Class inciso3
   Inherits System.Web.UI.Page

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

   End Sub


    Protected Sub btnguardar_Click(sender As Object, e As EventArgs) Handles btnguardar.Click
       Dim proveedor As New clsproveedor
       proveedor.setid(Integer.Parse(txtid.Text))
       proveedor.setnombre(txtnombreprov.Text)
       proveedor.setdirec(txtdireccion.Text)
       proveedor.settel(Integer.Parse(txttelefono.Text))
       proveedor.setgiro(txtgiro.Text)

       Dim prov As New proveedorBS
       Dim row As Integer
       row = prov.nuevoProveedor(proveedor)
       If row > 0 Then
           Me.lblMensaje.Text = "Insercion Correcta"
       Else
           Me.lblMensaje.Text = "Error en la Insercion"
       End If


este seria el code behind del aspx, y aqui abajo trato de sobreescribir el page_load con la clase pagina_base
Código (vbnet) [Seleccionar]

Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.HtmlControls
Imports System.Web.UI.SessionPageStatePersister
Imports System.Web.Services.Protocols

Public Class PaginaBase
   Inherits System.Web.UI.Page
   Protected Overrides Sub OnInit(e As EventArgs)
       MyBase.OnInit(e)
   End Sub
   Public Sub New()


       Page_Load()

   End Sub
   Protected Sub Page_Load()
       If Me.Session("UserID") Is Nothing Then
           Server.Transfer("Login.aspx")
       End If

   End Sub
   Public Shared Sub DisableControls(ByVal Parent As Control)

       enabledControls(Parent, False)
   End Sub
   Public Shared Sub enabledControls(ByVal Parent As Control, ByVal b As Boolean)
       Dim i As Integer = 0
       Dim var As Integer = 0


       'For i To Parent.Controls.Count -1  

       While i <= Parent.Controls.Count
           If TypeOf Parent.Controls(i) Is Button Then
               Parent.Controls(i).EnableViewState = b
           ElseIf TypeOf Parent.Controls(i) Is LinkButton Then
               Parent.Controls(i).EnableViewState = b
           ElseIf TypeOf Parent.Controls(i) Is TextBox Then
               Parent.Controls(i).EnableViewState = b
           ElseIf TypeOf Parent.Controls(i) Is DropDownList Then
               Parent.Controls(i).EnableViewState = b
           ElseIf TypeOf Parent.Controls(i) Is ListBox Then
               Parent.Controls(i).EnableViewState = b
           ElseIf TypeOf Parent.Controls(i) Is DataGrid Then
               Parent.Controls(i).EnableViewState = b
           ElseIf TypeOf Parent.Controls(i) Is GridView Then
               Parent.Controls(i).EnableViewState = b
           ElseIf TypeOf Parent.Controls(i) Is DataList Then
               Parent.Controls(i).EnableViewState = b
           ElseIf TypeOf Parent.Controls(i) Is HtmlInputButton Then
               Parent.Controls(i).EnableViewState = b
           ElseIf TypeOf Parent.Controls(i) Is HtmlInputButton Then
               Parent.Controls(i).EnableViewState = b
           ElseIf Parent.Controls(i).HasControls Then
               If b Then
                   EnableControls(Parent.Controls(i))
               Else
                   DisableControls(Parent.Controls(i))
               End If

           End If
       End While
       'Next

   End Sub
   Public Shared Sub EnableControls(ByVal Parent As Control)

       enabledControls(Parent, True)
   End Sub
    Public Function LoggedIn(HttpSessionState Session) as boolean
        dim Result as boolean
          Result = true
           if Session("UserName") is nothing then
           
               Result = false;
           
           if Session("UserID") is nothing null then
           
               Result = false;
           
           return Result;
     End Function  


End Class


y aqui esta el code behind del user control
Código (vbnet) [Seleccionar]


Public Class UCNavigation
   Inherits System.Web.UI.UserControl

   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
       Dim Logged As Boolean
       Logged = paginaBase.LoggedIn(Session)
       If Me.lnkChangePassword.Enabled Then
           Me.lnkChangePassword.CssClass = "izq"
       Else
           Me.lnkChangePassword.CssClass = "izqDesactivado"
       End If
       Page.ClientScript.RegisterStartupScript(Page.GetType(), "tttt", "ocultarEnlaces(" + Logged.ToString().ToLower() + ")", True)
       Me.divLogin.Visible = Not Logged
       If Logged Then
          Me .lnkHome.CssClass = "izq";
           Me.lblVentas.CssClass = "izq"
           Me.lnkAddVenta.CssClass = "izq"
           Me.lnkListVentass.CssClass = "izq"
           Me.lblProductos.CssClass = "izq"
           Me.lnkAddProducto.CssClass = "izq"
           Me.lnkListProductos.CssClass = "izqDos"
           Me.lblProveedores.CssClass = "izqDos"
           Me.lnkAddProveedor.CssClass = "izqDos"
           Me.lnkListProveedores.CssClass = "izqDos"
           Me.lblCompras.CssClass = "izqDos"
           Me.lnkAddCompra.CssClass = "izqDos"
           Me.lnkLogout.CssClass = "izq"
           Me.lnkListaCompras.CssClass = "izqDos"
           Me.lblBalance.CssClass = "izqDos"
           Me.lnkListaCompras.CssClass = "izqDos"
           Me.lnkAddCompra.CssClass = "izqDos"
           Me.lnkVerValance.CssClass = "izqDos"
           Me.lnkCaja.CssClass = "izqDos"
           Me.linkAddCliente.CssClass = "izqDos"
           Me.linkListCliente.CssClass = "izqDos"

       End If
   End Sub
   Protected Overrides Sub OnInit()
       Me.InitializeComponent()
       Base.OnInit()
   End Sub
   Private Sub InitializeComponent()
       Base.Load += New EventHandler(Me.Page_Load)
   End Sub
   

End Class

Eleкtro

#3
No manejo ASP.Net, pero de todas formas me parece que el problema que tienes es más bien de referencias y visibilidad de miembros, que no de herencia.

De todas formas sigo sin entender muy bien cual es el problema que tienes y quieres resolver, pero creo que si te puedo ayduar en algunas cosas que he notado:




1. La función PaginaBase.LoggedIn tienes que declararla compartida (shared) si pretendes usarlo aquí:
Citar
Código (vbnet,2) [Seleccionar]
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
   Dim isLogged As Boolean = PaginaBase.LoggedIn(Session)
...




2. ¿Por qué hay métodos definidos con sintaxis de C#?, ¿como este? (entre otros)
Citar
Código (vbnet,2) [Seleccionar]
Private Sub InitializeComponent()
   Base.Load += New EventHandler(Me.Page_Load)
End Sub

¿Estás intentando traducir un código de C# a VB.Net?, ese código es incompilable ya que en VB.Net para asociar un evento a un controlador de eventos se debe usar la instrucción AddHandler

Código (vbnet) [Seleccionar]
AddHandler Evento, Delegado

O haber declarado un objeto que pueda disparar eventos con el keyword WithEvents:

Código (vbnet) [Seleccionar]
Dim WithEvents obj As PaginaBase

Private Sub Obj_Load(ByVal sender As Object, ByVal e As EventArgs) Handles obj.Load
End Sub





3. Para poder suscribirte al evento, el método PaginaBase.Page_Load debe haber sido declarado compartido, o debes crear una instancia de la class PaginaBase para usar la referencia.

Código (vbnet) [Seleccionar]
Imports System.Web.SessionState

Public Class PaginaBase : Inherits System.Web.UI.Page

   Public Sub New()
       PaginaBase.Page_Load(Me, Nothing)
   End Sub

   Friend Shared Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
       ' ...
   End Sub

   Public Shared Function LoggedIn(ByVal session As HttpSessionState) As Boolean

       Return (session("UserName") IsNot Nothing) AndAlso (session("UserID") IsNot Nothing)

   End Function

End Class


Código (vbnet) [Seleccionar]
Public Class UCNavigation : Inherits System.Web.UI.UserControl

   Protected Overrides Sub OnInit(ByVal e As EventArgs)
       MyBase.OnInit(e)
       AddHandler MyBase.Load, AddressOf PaginaBase.Page_Load
   End Sub

   Protected Overrides Sub OnLoad(ByVal e As EventArgs)

       MyBase.OnLoad(e)

       Dim isLogged As Boolean = PaginaBase.LoggedIn(Session)
       ' etc...

   End Sub

End Class


Espero que esto te haya ayudado un poco aunque sea.

Saludos








d91

gracias por el aporte y lo que intento hacer es sobreescribir el metodo Page_Load del aspx.vb que viene heredado en el system.web.UI.page en la clase PaginaBase, lo de las lineas en c# es porque no he encontrado mucha documentacion para esto en visual basic y a veces  he tratado de convertir codigo c# a visual basic

Eleкtro

#5
Cita de: d91 en 28 Septiembre 2015, 14:09 PMlo que intento hacer es sobreescribir el metodo Page_Load del aspx.vb que viene heredado en el system.web.UI.page

Suponiendo que el método base Page_Load no haya sido declarado Overridable, ya que entonces lo siguiente no sería necesario al poder usar el keyword Overrides, siempre puedes llevar a cabo otro tipo de reemplazamiento del método base, redeclarándolo con el uso del keyword Shadows:

Código (vbnet) [Seleccionar]
Shadows Sub Page_Load()
End sub


Un ejemplo de lo otro sería...:
Código (vbnet) [Seleccionar]
Overrides Sub Page_Load(firma del método base)
End sub


¿Es eso a lo que te referías?.

Saludos








d91

bueno al final lo logre resolver en la pagina base seria asi:
Código (vbnet) [Seleccionar]

Public Class PaginaBase
    Inherits Page
    Protected Overrides Sub OnInit(e As EventArgs)
        MyBase.OnInit(e)
        If Me.Session("UserID") Is Nothing Then
            Server.Transfer("login.aspx")
        End If
    End Sub
End Class

y en la pagina.aspx.vb seria
Código (vbnet) [Seleccionar]

Public Class pagina
    Inherits PaginaBase

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

End Sub

MyBase no lo habia encontrado gracias por el aporte....