2010-12-14 8 views
1

나는 누구의 enabled 속성 I 클래스 (포함하는 페이지의 코드 숨김에서) 별도의를 사용하여 평가해야 Asp.Net TextBox 컨트롤이 있습니다. 나는이 작업을 수행 할 방법은 다음과 같습니다외부 메서드 호출에서 서버 컨트롤에 대한 자체 참조를 포함하려면 어떻게합니까?

<asp:TextBox ID="myTB" runat="server" Enabled="<% ToggleControl(this, "someBusinessValue") %>" ... /> 

내가 호출 컨트롤에 대한 참조를 전달해야하는 이유는 내가 그것을 비활성화하기 전에 고려해야 할 다른 속성이 있는지 확인하는 것입니다. 그러나 'this'키워드는 페이지 전체를 나타냅니다. 그리고 내 TextBox는 FormView 또는 GridView 내에있을 수 있기 때문에 'page.myTB'를 검사하여 컨트롤을 쉽게 얻을 수 없습니다. TextBox에 대한 참조를 검색하기 위해받는 클래스 파일에서 GridView를 통해 plowing을 시작하지 않아도됩니다.

사람이 방법으로 제어 인라인을 참조하는 방법을 알고 있나요?

편집 1 : 최고의 내가 함께 왔어요 :이는 등리스트 박스, 체크 박스 RadioButtonList, 같은 서버 컨트롤의 여러 가지 유형,

편집 2로 수행 될 필요가있을 것이다 지금까지 :

<asp:TextBox ID="myTB" runat="server" Enabled="<% ToggleControl(myGridView.FindControl("myTB") as WebControl, "someBusinessValue") %>" 

너무 우아하지는 않지만 필요한 자동 참조를 제공합니다.

+0

실제로 흥미로운 딜레마를 이잖아. 일반적으로 내 컨트롤을 필요로 할 때 논리를 자체 내에서 포함하는 내 자신의 특수 TextBox 하위 클래스 것이다. 결국, OO는 무엇에 관한 것입니까! –

+0

일반적으로 그렇게 하겠지만 원하는 동작은 모든 입력 컨트롤에 적용 할 수 있으므로 존재하는 각 입력 컨트롤을 서브 클래스 화하지 않아도되고 새로운 작업도 필요합니다. 우리는 또한 webcontroladapters를 사용하는 것을 고려하고 있었지만 좀 더 복잡했습니다. –

답변

0

컨트롤을 파생시키고 "AuthExpression"과 같은 새 속성을 추가하고 DataBinder.Eval 메서드로 평가할 수있는 데이터 바인딩 식을 사용할 수 있습니다.

또는 원하는 모든 컨트롤에 대해이 작업을 수행하는 ASP.NET AJAX Extender 컨트롤을 만들 수 있습니다. Extender에 의해 확장 된 컨트롤은 컨트롤을 사용하거나 사용하지 않도록 결정하는 데이터 바인딩 식을 나타냅니다.

나는 이것이 당신의 질문에 대답 희망!

1

나는 UI/데이터/코드 분리의 문제가 있다고 생각합니다.

나는 모든 데이터가 사용할 수 있도록이 결합하기 전에 데이터 소스에 대해 래퍼를 작성해야합니다 생각합니다. 이

================================ ... 등 중첩 된 컨트롤과를 찾을 필요가 없도록합니다 =============

다른 개체에 컨트롤을 전달하고 싶지는 않습니다. 그 이유는 응용 프로그램의 UI를 변경해야하는 경우 해당 UI 요소를 참조하는 모든 것을 다시 작성해야하기 때문입니다. -> 페이지 -에 ORM/사용자 정의 데이터 개체 또는 모음 -> 오브젝트/컬렉션의 인스턴스> UI

데이터 소스 (테이블) :

여기에 데이터를 표시하는 간단한 방법입니다.

귀하의 UI idealy는 페이지 (Session/AppState/ViewState)에서 asp.net이 제공하는 상태 개체 중 하나에 가상으로 저장 (공용 및 보호 속성으로 래핑 됨)되는 개체 인스턴스에 바인딩해야합니다. .

UI의 업데이트는 System.Transaction.TransactionScope를 사용하여 트랜잭션을 통해 상태뿐만 아니라 데이터 소스에 저장된 개체로 전파 될 수 있습니다. 그러면 데이터 원본이 연결이 끊어진 데이터와 동일하게됩니다. , 장애 발생시에는 완만 한 성능 저하를 제공합니다.

런타임/다른 페이지에서 개체/컬렉션의 인스턴스에 액세스 할 때 공용 속성이나 변수가이 목적을 용이하게합니다.

이 개념을 사용하면 컨트롤을 전달하지 않아도됩니다. 데이터 객체를 소비하거나 대신 작업을 수행하는 객체/UI 요소간에 데이터 객체를주고받습니다.

1

가 귀하의 질문에 대답하기 위해 옵저버 패턴 또는 간단한 대표를 통해 다른 사람에게 광고 할 수있는 두 개 이상의 런타임 구성 요소 내부에서 발생하는

업데이트 ... ...

Enabled='<%# ToggleControl(FindControl("txtSomething") as WebControl,new SomeAssessor().EnabledWhenIdXyz) %>' 

당신이 사용할 수있는이

public bool ToggleControl(WebControl control, Func<WebControl, bool> assessControl) 
{ 
    return assessControl(control); 
} 

뒤에 코드에서 도우미 그리고 이것은 당신이

을 언급 한 별도의 클래스
public class SomeAssessor 
{ 
    public bool EnabledWhenIdXyz(WebControl control) 
    { 
     return control.ID == "txtSomething2"; 
    } 
} 

여기에 대신 할 수있는 제안 아이디어 : 당신은 IEnumerable<SomeModel>이있는 gridview에 대한 데이터 소스에서 반환 할 수도 있습니다. SomeViewModel 개체는 원래 데이터를 사용자 컨트롤에 필요한 정확한 '모양'으로 변환 한 것입니다.

public class SomeModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class SomeViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool Enabled { get; set; } 
} 

모델을보기로 변환하는 매퍼를 만드십시오. 여기에서 사용 가능 평가가 발생할 수 있습니다.

public interface IMapper<TModel, TViewModel> 
{ 
    TViewModel MapModelToView(TModel source); 
} 

public class SomeMapper : IMapper<IEnumerable<SomeModel>, IEnumerable<SomeViewModel>> 
{ 
    public IEnumerable<SomeViewModel> MapModelToView(IEnumerable<SomeModel> source) 
    { 
     return source.Select(x => new SomeViewModel 
             { 
              Id = x.Id, 
              Name = x.Name, 
              Enabled = true //call to your method and resolve 
             }); 
    } 
} 

그런 다음 IEnumerable<SomeModel>로 데이터를 쿼리 매핑과의 GridView의 데이터 소스로 IEnumerable<SomeViewModel>를 사용합니다.

그런 다음 텍스트 상자에 다음과 같은 평가를 작성할 수 있습니다

Enabled='<%# Eval("Enabled")%>' 
관련 문제