2009-05-20 2 views
2

나는 아주 비슷한 두 가지 aspx 페이지가 있으며 코드 뒤에 다양한 기능이 있습니다. 두 클래스의 코드가 파생 된 기본 클래스를 만들고 싶습니다. 기본 클래스가 aspx 페이지의 컨트롤에 액세스 할 수 있습니까? 예를 들어 :기본 클래스에서 aspx 컨트롤 사용

'txtName' is not a member of 'clsbase' 

가 함께 두 가지를 연결하는 것이 가능 :

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 

는 다소 이해할 코드로 컴파일에 실패?

+0

답변을 다시 확인하십시오. 추가 설명이 추가되었습니다. – Kirtan

+0

흠. 두 페이지 모두에서 값을 설정하려면 OOish가 아닌 FindControl 방식을 사용할 수 있습니다. – Kirtan

+0

그러나 UI 관련 메서드는 페이지에서 격리되어야하며 공통으로 사용하면 안됩니다. 여기에서는 페이지의 텍스트 상자에 텍스트를 설정하려고하므로 코드를 복제하고 두 페이지에 공통으로 설정하는 것이 좋습니다. – Kirtan

답변

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" ... %> 
+0

비주얼 디자이너를 사용하여 페이지가 이미 디자인되었으므로 사용할 수 없으며 코드의 모든 컨트롤 위치를 설정하는 데 오래 걸렸을 것입니다. 그래도 고마워 – Patrick

0

FindControl을 사용할 수 있습니다.

TextBox txtName=FindControl("txtName"); 

자손 클래스에 의해 렌더링되었지만 렌더링 된 페이지에서 컨트롤을 찾을 수 있습니다. 이것은 OO의 요점과 기능/데이터의 분리를 어느 정도 깨뜨리고있다.

0

((TextBox) Page.FindControl ("txtName"))을 사용하여 텍스트 상자를 가져올 수 있습니다. 이 기본 클래스를 컨트롤이 존재하지 않는 곳에 사용하면주의해야합니다.

+0

정말로 원하지 않는 것이 있습니다. 컨트롤이 기본 클래스와 파생 클래스 모두에서 '기본적으로'액세스 할 수 있기를 바랍니다. 파생 클래스는 실제로 서로 다른 aspx 페이지에 연결되며, 공통된 컨트롤이 많이 있습니다. 어떤 식 으로든 – Patrick

2

코드를 리팩토링하면 더 좋을 것이므로 이렇게 할 필요가 없습니다.

하위 클래스에서 가상 메소드를 생성하고 하위 페이지에서 재정의하고 텍스트 상자의 값을 설정할 수 있다면 더 좋은 아이디어가 될 것입니다. 텍스트 상자. 가상 재산

protected TextBox txtName 
{ 
get{return (TextBox)Page.FindControl("txtName");} 
set{Page.FindControl("txtName") = vale;} 
} 

또는 만들기 : 당신은 속성을 만들 수

: 귀하의 해명에 대응

+0

리팩토링? 현재 코드를 리팩토링하여 반복 코드를 기본 클래스로 제거하려고합니다. – Patrick

+0

Kirtan에게 시간을내어 주셔서 감사합니다. 문제는 두 개의 다른 페이지에서 George에게 값을 설정하려는 것입니다 ... – Patrick

0

이 경우

protected virtual TextBox txtName{get;set;} 

을 당신은 그것을 무시해야 귀하의 메인 클래스

protected override TextBox txtName{/*same as above*/} 
관련 문제