Autor
|
Tema: Pagina que hereda clase (Leído 4,068 veces)
|
d91
Desconectado
Mensajes: 165
|
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
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.878
|
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, IExpressionsAccessorPodemos 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
|
|
« Última modificación: 27 Septiembre 2015, 11:07 am por Eleкtro »
|
En línea
|
|
|
|
d91
Desconectado
Mensajes: 165
|
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
|
|
« Última modificación: 27 Septiembre 2015, 14:49 pm por Eleкtro »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.878
|
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í: 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) 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 AddHandlerAddHandler 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
|
|
« Última modificación: 27 Septiembre 2015, 16:51 pm por Eleкtro »
|
En línea
|
|
|
|
d91
Desconectado
Mensajes: 165
|
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
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.878
|
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: 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
|
|
« Última modificación: 28 Septiembre 2015, 15:11 pm por Eleкtro »
|
En línea
|
|
|
|
d91
Desconectado
Mensajes: 165
|
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....
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema de interacion entre una clase Interfaz y la clase que la llama
Java
|
yeah69
|
4
|
4,533
|
21 Mayo 2010, 06:30 am
por we4rt
|
|
|
Enviar datos de un formulario de una pagina JSP a una clase.
Java
|
h3ct0r
|
3
|
8,334
|
22 Febrero 2011, 20:07 pm
por h3ct0r
|
|
|
Como sobre-escribir un método de una clase base en una clase heredada?
Programación C/C++
|
julian21931500
|
5
|
3,859
|
25 Febrero 2015, 23:49 pm
por ivancea96
|
|
|
Ayuda llamar a una clase y sus métodos dentro de otra clase (Android)
Java
|
LikeVodka
|
1
|
6,248
|
19 Abril 2015, 11:22 am
por MNicolas
|
|
|
El 5G hereda vulnerabilidades de las generaciones anteriores que amenazan el ...
Noticias
|
wolfbcn
|
1
|
1,665
|
26 Noviembre 2019, 02:58 am
por @XSStringManolo
|
|