Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: d91 en 27 Septiembre 2015, 03:29 am



Título: Pagina que hereda clase
Publicado por: d91 en 27 Septiembre 2015, 03:29 am
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
  1. Public Class inciso3
  2.    Inherits System.Web.UI.Page
  3.  


Título: Re: Pagina que hereda clase
Publicado por: Eleкtro en 27 Septiembre 2015, 10:56 am
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
  1. Public Class UserCtrl : Inherits System.Web.UI.UserControl
  2.  
  3. End Class
  4.  
  5. Public Class PaginaBase : Inherits System.Web.UI.Page
  6.  
  7.    Public Sub New()
  8.    End Sub
  9.  
  10. End Class
  11.  
  12. Public NotInheritable Class Inciso3 : Inherits PaginaBase
  13.  
  14. 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
  1. Public NotInheritable Class Multi
  2.  
  3.    Public ReadOnly Property UserCtrl As UserCtrl
  4.        Get
  5.            Return Me.userCtrlB
  6.        End Get
  7.    End Property
  8.    Private userCtrlB As UserCtrl
  9.  
  10.    Public ReadOnly Property PaginaBase As PaginaBase
  11.        Get
  12.            Return Me.paginaBaseB
  13.        End Get
  14.    End Property
  15.    Private paginaBaseB As PaginaBase
  16.  
  17.    Public Sub New()
  18.        Me.userCtrlB = New UserCtrl
  19.        Me.paginaBaseB = New PaginaBase
  20.    End Sub
  21.  
  22. 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
  1. Public Class TestClass
  2.    Inherits Otraclass
  3.    Implements System.IDisposable,
  4.               System.ComponentModel.IComponent,
  5.               System.Web.IHttpHandler,
  6.               System.Web.UI.IControlBuilderAccessor,
  7.               System.Web.UI.IControlDesignerAccessor,
  8.               System.Web.UI.IDataBindingsAccessor,
  9.               System.Web.UI.IExpressionsAccessor,
  10.               System.Web.UI.IFilterResolutionService,
  11.               System.Web.UI.INamingContainer,
  12.               System.Web.UI.IParserAccessor,
  13.               System.Web.UI.IUrlResolutionService
  14.  
  15.    Public Event Disposed(sender As Object, e As EventArgs) Implements IComponent.Disposed
  16.  
  17.    Public Property Site As ISite Implements IComponent.Site
  18.  
  19.    Public ReadOnly Property DataBindings As Web.UI.DataBindingCollection Implements Web.UI.IDataBindingsAccessor.DataBindings
  20.        Get
  21.        End Get
  22.    End Property
  23.  
  24.    Public ReadOnly Property HasDataBindings As Boolean Implements Web.UI.IDataBindingsAccessor.HasDataBindings
  25.        Get
  26.        End Get
  27.    End Property
  28.  
  29.    Public ReadOnly Property ControlBuilder As Web.UI.ControlBuilder Implements Web.UI.IControlBuilderAccessor.ControlBuilder
  30.        Get
  31.        End Get
  32.    End Property
  33.  
  34.    Public ReadOnly Property UserData As IDictionary Implements Web.UI.IControlDesignerAccessor.UserData
  35.        Get
  36.        End Get
  37.    End Property
  38.  
  39.    Public ReadOnly Property Expressions As Web.UI.ExpressionBindingCollection Implements Web.UI.IExpressionsAccessor.Expressions
  40.        Get
  41.        End Get
  42.    End Property
  43.  
  44.    Public ReadOnly Property HasExpressions As Boolean Implements Web.UI.IExpressionsAccessor.HasExpressions
  45.        Get
  46.        End Get
  47.    End Property
  48.  
  49.    Public Sub New()
  50.    End Sub
  51.  
  52.    Public ReadOnly Property IsReusable As Boolean Implements Web.IHttpHandler.IsReusable
  53.        Get
  54.        End Get
  55.    End Property
  56.  
  57.    Public Sub ProcessRequest(context As Web.HttpContext) Implements Web.IHttpHandler.ProcessRequest
  58.    End Sub
  59.  
  60.    Public Function CompareFilters(filter1 As String, filter2 As String) As Integer Implements Web.UI.IFilterResolutionService.CompareFilters
  61.    End Function
  62.  
  63.    Public Function EvaluateFilter(filterName As String) As Boolean Implements Web.UI.IFilterResolutionService.EvaluateFilter
  64.    End Function
  65.  
  66.    Public Sub AddParsedSubObject(obj As Object) Implements Web.UI.IParserAccessor.AddParsedSubObject
  67.    End Sub
  68.  
  69.    Public Function ResolveClientUrl(relativeUrl As String) As String Implements Web.UI.IUrlResolutionService.ResolveClientUrl
  70.    End Function
  71.  
  72.    Public Function GetDesignModeState() As IDictionary Implements Web.UI.IControlDesignerAccessor.GetDesignModeState
  73.    End Function
  74.  
  75.    Public Sub SetDesignModeState(data As IDictionary) Implements Web.UI.IControlDesignerAccessor.SetDesignModeState
  76.    End Sub
  77.  
  78.    Public Sub SetOwnerControl(owner As Web.UI.Control) Implements Web.UI.IControlDesignerAccessor.SetOwnerControl
  79.    End Sub
  80.  
  81. #Region "IDisposable Support"
  82.    Private disposedValue As Boolean ' To detect redundant calls
  83.  
  84.    ' IDisposable
  85.    Protected Overridable Sub Dispose(disposing As Boolean)
  86.        If Not Me.disposedValue Then
  87.            If disposing Then
  88.                ' TODO: dispose managed state (managed objects).
  89.            End If
  90.  
  91.            ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
  92.            ' TODO: set large fields to null.
  93.        End If
  94.        Me.disposedValue = True
  95.    End Sub
  96.  
  97.    ' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources.
  98.    'Protected Overrides Sub Finalize()
  99.    '    ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
  100.    '    Dispose(False)
  101.    '    MyBase.Finalize()
  102.    'End Sub
  103.  
  104.    ' This code added by Visual Basic to correctly implement the disposable pattern.
  105.    Public Sub Dispose() Implements IDisposable.Dispose
  106.        ' Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
  107.        Dispose(True)
  108.        GC.SuppressFinalize(Me)
  109.    End Sub
  110. #End Region
  111.  
  112. End Class

Saludos


Título: Re: Pagina que hereda clase
Publicado por: d91 en 27 Septiembre 2015, 13:25 pm
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
  1. Imports Businness
  2. Imports Modelo
  3. Public Class inciso3
  4.    Inherits System.Web.UI.Page
  5.  
  6.    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  7.  
  8.    End Sub
  9.  
  10.  
  11.     Protected Sub btnguardar_Click(sender As Object, e As EventArgs) Handles btnguardar.Click
  12.        Dim proveedor As New clsproveedor
  13.        proveedor.setid(Integer.Parse(txtid.Text))
  14.        proveedor.setnombre(txtnombreprov.Text)
  15.        proveedor.setdirec(txtdireccion.Text)
  16.        proveedor.settel(Integer.Parse(txttelefono.Text))
  17.        proveedor.setgiro(txtgiro.Text)
  18.  
  19.        Dim prov As New proveedorBS
  20.        Dim row As Integer
  21.        row = prov.nuevoProveedor(proveedor)
  22.        If row > 0 Then
  23.            Me.lblMensaje.Text = "Insercion Correcta"
  24.        Else
  25.            Me.lblMensaje.Text = "Error en la Insercion"
  26.        End If
  27.  
  28.  
este seria el code behind del aspx, y aqui abajo trato de sobreescribir el page_load con la clase pagina_base
Código
  1. Imports System.Web.UI
  2. Imports System.Web.UI.WebControls
  3. Imports System.Web.UI.HtmlControls
  4. Imports System.Web.UI.SessionPageStatePersister
  5. Imports System.Web.Services.Protocols
  6.  
  7. Public Class PaginaBase
  8.    Inherits System.Web.UI.Page
  9.    Protected Overrides Sub OnInit(e As EventArgs)
  10.        MyBase.OnInit(e)
  11.    End Sub
  12.    Public Sub New()
  13.  
  14.  
  15.        Page_Load()
  16.  
  17.    End Sub
  18.    Protected Sub Page_Load()
  19.        If Me.Session("UserID") Is Nothing Then
  20.            Server.Transfer("Login.aspx")
  21.        End If
  22.  
  23.    End Sub
  24.    Public Shared Sub DisableControls(ByVal Parent As Control)
  25.  
  26.        enabledControls(Parent, False)
  27.    End Sub
  28.    Public Shared Sub enabledControls(ByVal Parent As Control, ByVal b As Boolean)
  29.        Dim i As Integer = 0
  30.        Dim var As Integer = 0
  31.  
  32.  
  33.        'For i To Parent.Controls.Count -1  
  34.  
  35.        While i <= Parent.Controls.Count
  36.            If TypeOf Parent.Controls(i) Is Button Then
  37.                Parent.Controls(i).EnableViewState = b
  38.            ElseIf TypeOf Parent.Controls(i) Is LinkButton Then
  39.                Parent.Controls(i).EnableViewState = b
  40.            ElseIf TypeOf Parent.Controls(i) Is TextBox Then
  41.                Parent.Controls(i).EnableViewState = b
  42.            ElseIf TypeOf Parent.Controls(i) Is DropDownList Then
  43.                Parent.Controls(i).EnableViewState = b
  44.            ElseIf TypeOf Parent.Controls(i) Is ListBox Then
  45.                Parent.Controls(i).EnableViewState = b
  46.            ElseIf TypeOf Parent.Controls(i) Is DataGrid Then
  47.                Parent.Controls(i).EnableViewState = b
  48.            ElseIf TypeOf Parent.Controls(i) Is GridView Then
  49.                Parent.Controls(i).EnableViewState = b
  50.            ElseIf TypeOf Parent.Controls(i) Is DataList Then
  51.                Parent.Controls(i).EnableViewState = b
  52.            ElseIf TypeOf Parent.Controls(i) Is HtmlInputButton Then
  53.                Parent.Controls(i).EnableViewState = b
  54.            ElseIf TypeOf Parent.Controls(i) Is HtmlInputButton Then
  55.                Parent.Controls(i).EnableViewState = b
  56.            ElseIf Parent.Controls(i).HasControls Then
  57.                If b Then
  58.                    EnableControls(Parent.Controls(i))
  59.                Else
  60.                    DisableControls(Parent.Controls(i))
  61.                End If
  62.  
  63.            End If
  64.        End While
  65.        'Next
  66.  
  67.    End Sub
  68.    Public Shared Sub EnableControls(ByVal Parent As Control)
  69.  
  70.        enabledControls(Parent, True)
  71.    End Sub
  72.     Public Function LoggedIn(HttpSessionState Session) as boolean
  73.         dim Result as boolean
  74.           Result = true
  75.            if Session("UserName") is nothing then
  76.  
  77.                Result = false;
  78.  
  79.            if Session("UserID") is nothing null then
  80.  
  81.                Result = false;
  82.  
  83.            return Result;
  84.      End Function  
  85.  
  86.  
  87. End Class
  88.  
  89.  
y aqui esta el code behind del user control
Código
  1.  
  2. Public Class UCNavigation
  3.    Inherits System.Web.UI.UserControl
  4.  
  5.    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  6.        Dim Logged As Boolean
  7.        Logged = paginaBase.LoggedIn(Session)
  8.        If Me.lnkChangePassword.Enabled Then
  9.            Me.lnkChangePassword.CssClass = "izq"
  10.        Else
  11.            Me.lnkChangePassword.CssClass = "izqDesactivado"
  12.        End If
  13.        Page.ClientScript.RegisterStartupScript(Page.GetType(), "tttt", "ocultarEnlaces(" + Logged.ToString().ToLower() + ")", True)
  14.        Me.divLogin.Visible = Not Logged
  15.        If Logged Then
  16.           Me .lnkHome.CssClass = "izq";
  17.            Me.lblVentas.CssClass = "izq"
  18.            Me.lnkAddVenta.CssClass = "izq"
  19.            Me.lnkListVentass.CssClass = "izq"
  20.            Me.lblProductos.CssClass = "izq"
  21.            Me.lnkAddProducto.CssClass = "izq"
  22.            Me.lnkListProductos.CssClass = "izqDos"
  23.            Me.lblProveedores.CssClass = "izqDos"
  24.            Me.lnkAddProveedor.CssClass = "izqDos"
  25.            Me.lnkListProveedores.CssClass = "izqDos"
  26.            Me.lblCompras.CssClass = "izqDos"
  27.            Me.lnkAddCompra.CssClass = "izqDos"
  28.            Me.lnkLogout.CssClass = "izq"
  29.            Me.lnkListaCompras.CssClass = "izqDos"
  30.            Me.lblBalance.CssClass = "izqDos"
  31.            Me.lnkListaCompras.CssClass = "izqDos"
  32.            Me.lnkAddCompra.CssClass = "izqDos"
  33.            Me.lnkVerValance.CssClass = "izqDos"
  34.            Me.lnkCaja.CssClass = "izqDos"
  35.            Me.linkAddCliente.CssClass = "izqDos"
  36.            Me.linkListCliente.CssClass = "izqDos"
  37.  
  38.        End If
  39.    End Sub
  40.    Protected Overrides Sub OnInit()
  41.        Me.InitializeComponent()
  42.        Base.OnInit()
  43.    End Sub
  44.    Private Sub InitializeComponent()
  45.        Base.Load += New EventHandler(Me.Page_Load)
  46.    End Sub
  47.  
  48.  
  49. End Class
  50.  


Título: Re: Pagina que hereda clase
Publicado por: Eleкtro en 27 Septiembre 2015, 15:18 pm
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
  1. Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  2.    Dim isLogged As Boolean = PaginaBase.LoggedIn(Session)
  3. ...



2. ¿Por qué hay métodos definidos con sintaxis de C#?, ¿como este? (entre otros)
Citar
Código
  1. Private Sub InitializeComponent()
  2.    Base.Load += New EventHandler(Me.Page_Load)
  3. 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
  1. AddHandler Evento, Delegado

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

Código
  1. Dim WithEvents obj As PaginaBase
  2.  
  3. Private Sub Obj_Load(ByVal sender As Object, ByVal e As EventArgs) Handles obj.Load
  4. 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
  1. Imports System.Web.SessionState
  2.  
  3. Public Class PaginaBase : Inherits System.Web.UI.Page
  4.  
  5.    Public Sub New()
  6.        PaginaBase.Page_Load(Me, Nothing)
  7.    End Sub
  8.  
  9.    Friend Shared Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
  10.        ' ...
  11.    End Sub
  12.  
  13.    Public Shared Function LoggedIn(ByVal session As HttpSessionState) As Boolean
  14.  
  15.        Return (session("UserName") IsNot Nothing) AndAlso (session("UserID") IsNot Nothing)
  16.  
  17.    End Function
  18.  
  19. End Class

Código
  1. Public Class UCNavigation : Inherits System.Web.UI.UserControl
  2.  
  3.    Protected Overrides Sub OnInit(ByVal e As EventArgs)
  4.        MyBase.OnInit(e)
  5.        AddHandler MyBase.Load, AddressOf PaginaBase.Page_Load
  6.    End Sub
  7.  
  8.    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
  9.  
  10.        MyBase.OnLoad(e)
  11.  
  12.        Dim isLogged As Boolean = PaginaBase.LoggedIn(Session)
  13.        ' etc...
  14.  
  15.    End Sub
  16.  
  17. End Class

Espero que esto te haya ayudado un poco aunque sea.

Saludos


Título: Re: Pagina que hereda clase
Publicado por: d91 en 28 Septiembre 2015, 14:09 pm
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


Título: Re: Pagina que hereda clase
Publicado por: Eleкtro en 28 Septiembre 2015, 15:02 pm
lo 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
  1. Shadows Sub Page_Load()
  2. End sub

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

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

Saludos


Título: Re: Pagina que hereda clase
Publicado por: d91 en 28 Septiembre 2015, 15:44 pm
bueno al final lo logre resolver en la pagina base seria asi:
Código
  1. Public Class PaginaBase
  2.    Inherits Page
  3.    Protected Overrides Sub OnInit(e As EventArgs)
  4.        MyBase.OnInit(e)
  5.        If Me.Session("UserID") Is Nothing Then
  6.            Server.Transfer("login.aspx")
  7.        End If
  8.    End Sub
  9. End Class
  10.  
y en la pagina.aspx.vb seria
Código
  1. Public Class pagina
  2.    Inherits PaginaBase
  3.  
  4. Protected Overloads Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  5.  
  6. End Sub
  7.  
MyBase no lo habia encontrado gracias por el aporte....