我有两个非常相似的aspx页面,后面的代码中有各种相同的功能。我想创建一个基类,它可以从后面的代码派生出来。基类是否可以访问aspx页面上的控件。例如:
class base
inherits System.Web.UI.Page
Sub prepareScreen()
'txtName is a text box on the aspx page
Me.txtName.text = "George"
end sub
end class
class codeBehind
inherits base
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
prepareScreen()
end sub
end class
有点可以理解,代码无法编译:
'txtName' is not a member of 'clsbase'
是否可以将两者联系在一起?
答案 0 :(得分:2)
如果你重构你的代码会更好,所以你不需要做这样的事情。
如果您在基类中创建一个虚拟方法,您可以在子页面中覆盖该虚拟方法,并设置文本框的值,因为您可以轻松访问文本框
答案 1 :(得分:2)
您需要将控件声明为基类的属性。然后在ASP标记中,使用CodeFileBaseClass属性。
MSDN reference已不再可用。
class base
inherits System.Web.UI.Page
Protected Property txtName() As TextBox
Sub prepareScreen()
'txtName is a text box on the aspx page
Me.txtName.text = "George"
end sub
end class
class codeBehind
inherits base
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
prepareScreen()
end sub
end class
<%@ page CodeFileBaseClass="base" inherits="codebehind" ... %>
答案 2 :(得分:0)
您可以使用FindControl,例如
TextBox txtName=FindControl("txtName");
即使它是由后代类呈现的,它也会在渲染页面上找到控件。虽然这在某种程度上突破了OO和功能/数据的分离。
答案 3 :(得分:0)
您可以使用((TextBox)Page.FindControl(“txtName”))来获取文本框。要小心,因为如果你使用控件可能不存在的其他基类
答案 4 :(得分:0)
回应你的澄清:
您可以创建一个属性:
protected TextBox txtName
{
get{return (TextBox)Page.FindControl("txtName");}
set{Page.FindControl("txtName") = vale;}
}
或创建虚拟财产:
protected virtual TextBox txtName{get;set;}
在这种情况下,你必须在主类
覆盖它 protected override TextBox txtName{/*same as above*/}