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
Public Class inciso3
Inherits System.Web.UI.Page
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:
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.
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:
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
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:
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
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
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
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í:
CitarProtected 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)
CitarPrivate 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
AddHandler Evento, Delegado
O haber declarado un objeto que pueda disparar eventos con el keyword WithEvents:
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.
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
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
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
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:
Shadows Sub Page_Load()
End sub
Un ejemplo de lo otro sería...:
Overrides Sub Page_Load(firma del método base)
End sub
¿Es eso a lo que te referías?.
Saludos
bueno al final lo logre resolver en la pagina base seria asi:
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
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....