2010-03-26 3 views
0

이벤트 처리기를 구독 할 때 찬반 양론에 대해 궁금합니다.이벤트 처리기 구독

<asp:DropDownList id="DropDownList1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" /> 

보기의 기술적 관점에서

protected void Page_Init(object sender, EventArgs e) 
{ 
    this.DropDownList1.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged); 
} 

답변

3

대,이 둘 사이에 어떤 큰 차이가없는, 그래서 스타일과 개인 환경 설정을 코딩의 문제이다.

  • 은 ASP.NET 마크 업을 사용하여 선언적 접근 방식은 일반적으로 짧고 당신이 핸들러를 초기화하면 모든 초기화
  • 을하는 많은 방법이 필요하지 않습니다 : 여기 당신이 고려할 수있는 점 몇입니다 코드 숨김에서는 선언적 마크 업을 코드 숨김과 관련된 부분만으로 오염시키지 않습니다 (비록 이것이 큰 문제라고 생각하지 않지만).

다음과 같은 기능을 사용할 수 있습니다. 코드 숨김에 C# lambda 표현식 :

protected void Page_Init(object sender, EventArgs e) { 
    this.btnNext += (s1, e1) => MovePage(this.CurrentPage + 1); 
    this.btnPrev += (s2, e2) => MovePage(this.CurrentPage - 1); 
    // ... 
} 

이런 식으로 작성해야하는 단일 목적 이벤트 처리 메서드의 수를 줄일 수 있으므로 코드 숨김이 간단 해집니다.

그러나 단순한 ASP.NET 응용 프로그램에 대한 일반적인 권장 사항은 위의 예 에서처럼 그렇게하지 않는 좋은 이유가없는 한 선언적 이벤트 처리기 바인딩을 사용하는 것입니다.

+1

감사합니다. 마크 업 대신 페이지 초기화에 추가하는 아이디어가 마음에 들었습니다. 따라서 편리한 위치에 모두 포함 시켰습니다. – Neil

+0

마크 업 중에 동일한 위치에 두었을 수도 있습니다. 그래서 당신은 그것에 대한 결정을 내릴 수 없습니다. – citronas

+0

물론 그들은 모두 aspx 마크 업에 포함되지만, 내 페이지가 500 라인 길이로 버튼과 드롭 다운 이벤트가있는 이벤트가있는 경우라면 모든 곳에서 사용할 수 있습니다. – Neil

3

한 가지 차이점은 컴파일 타임 검사입니다. 선언적 메서드를 사용하고 어떤 이유로 처리기 메서드 이름이나 서명을 변경하면 ASP.NET 런타임에서 페이지를 처리 ​​할 때까지 알 수 없습니다. 코드 숨김에서 명시 적 바인딩을 사용하면 컴파일 시간을 확인할 수 있습니다. 조금 더 안정적입니다.

또한 일부는 마크 업에 이벤트 처리기를 두는 것이 우려 사항 분리 규칙과 모순된다고 주장 할 것입니다. ASP.NET 웹 양식의 경우에도 MVC 프레임 워크에서 볼 수있는 별개의 분리와 달리 여전히 약간의 크로스 오버가 있습니다.

+0

사실이지만 분명히 구독하면 확실하게 우려를 분리하는 데 도움이됩니다. – Neil