【问题标题】:Using aspx controls in base class在基类中使用 aspx 控件
【发布时间】:2009-05-20 08:49:32
【问题描述】:

我有两个非常相似的 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'

有没有可能将两者联系在一起?

【问题讨论】:

  • 再次查看答案,我已经添加了一些解释。
  • 嗯。如果要在两个页面中设置值,则可以使用 FindControl 方式,但它不是 OOish。
  • 但是 UI 相关的方法必须在你的页面中隔离,它们不应该通用。在这里,您想在页面上的文本框中设置一些文本,因此最好复制代码并将其设置在两个页面中,而不是使其通用。

标签: asp.net vb.net


【解决方案1】:

您需要将控件声明为基类的属性。然后在 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】:

如果你重构你的代码会更好,这样你就不需要做这样的事情了。

一个更好的主意是在基类中创建一个虚拟方法,您可以在子页面中覆盖该方法,并设置文本框的值,因为您可以轻松访问文本框.

【讨论】:

  • 以什么方式重构?我现在正在重构代码,试图将重复的代码删除到基类中。
  • 感谢您抽出时间 Kirtan。问题是我想在两个单独的页面上将值设置为 George...
【解决方案3】:

您可以使用 FindControl,例如。

TextBox txtName=FindControl("txtName");

即使它是由后代类呈现的,也会在呈现的页面上找到控件。虽然这在某种程度上打破了面向对象和功能/数据分离的观点。

【讨论】:

    【解决方案4】:

    您可以使用 ((TextBox)Page.FindControl("txtName")) 来获取文本框。请小心,因为如果您使用此基类,则控件可能不存在的其他地方

    【讨论】:

    • 不是我真正想做的。我希望控件在基类和派生类中都可以“本地”访问。派生类实际上链接到不同的 aspx 页面,它们只是有许多共同的控件。
    【解决方案5】:

    回应您的澄清:

    你可以创建一个属性:

    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*/}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-28
      • 2014-02-13
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      相关资源
      最近更新 更多