문제

나는 왜 많은 예와 사람들이 Webforms를 사용할 때 ondatabinding 이벤트를 구현하는 ASPX 코드에서 인라인 데이터 바인딩을 사용하는 것을 선호하는 이유를 확인하기 위해이 질문을 할 것이라고 생각했습니다.

어떠한 것도 데이터 컨트롤 (예 : 리피터, 그리드 뷰 등) 상자에 내장되지 않은 작업을 수행 해야하는 경우 항상 필드 레벨 컨트롤을위한 Ondatabinding 방법을 구현합니다 (예 : 평가를해야합니다). 내가 보는 대부분의 예제에는 인라인 <%# syntax를 사용하여 ASPX 페이지에 코드가 바로 있습니다.

인라인 asp.net 코드의 예 :

<asp:Literal ID="litExample" runat="server"
    Text='<%# Eval("ExampleField").ToString() %>' />

내가 그것을 선호하는 방법의 예 :

ASPX에서 :

<asp:Literal ID="litExample" runat="server" 
    OnDataBinding="litExample_DataBinding" />

CodeBehind .CS :

protected void litExample_DataBinding(object sender, System.EventArgs e)
{
    Literal lit = (Literal)(sender);
    lit.Text = string.Format("{1} - {2}",
        Eval("ExampleField").ToString(),
        Eval("ExampleField2").ToString());
}

나는 개인적으로 CodeBehind 메소드를 선호하고 ASPX 페이지를 깨끗하게 유지 하고이 모든 인라인 코드가있는 것은 아니며 다음 사람은 코드 변경을 위해 항상 .CS 파일을 보는 것을 알고 있습니다. HTML이 장소 보유자이며 Codebind가 실제로 제어되는 것을 결정하고 있기 때문에 프레젠테이션과 코드의 분리는 이러한 방식으로 더 잘 유지됩니다.

이제 이것들은 매우 기본적인 예입니다. 이 필드는 특정 형식이 필요한 0S 또는 DateTime과 형식으로 형식화하려는 정수 일 수 있습니다. 끝.

인라인 코드를 사용하는 경우 어디에 라인을 그리고 코드 베인으로 이동합니까?

어느 쪽이든 그렇게하는 장단점은 무엇입니까?

하나는 다른 것보다 더 많은 오버 헤드를 취합니까?

참고 편집 : 나는 페이지에있는 컨트롤에 값을 할당하는 것에 대해 이야기하는 것이 아니라 리피터 템플릿이나 그리드 뷰 항목 템플릿 등에 존재하기 때문에 데이터 라운드에있는 것입니다 ... 분명히 페이지에 앉아있는 문자 그대로 할당 할 수 있습니다. 코드에서.

참고 편집 : 특히 오버 헤드와 관련하여 더 많은 응답을 수집 할 것이라고 생각했습니다. 대부분의 사람들은 ondatabinding 이벤트를 사용하지 않습니까?

도움이 되었습니까?

해결책

그들 사이에는 성능 차이가 거의 없습니다. 데이터 바인딩 표현식은 구문 분석되어 다음과 같은 것으로 구성됩니다.

control.DataBinding += new EventHandler(ControlDataBinding);

그리고 또한

private void ControlDataBinding(object sender, EventArgs e) {
    control.Text = Eval("Field");
}

이 경우, ondatabinding 방법은 무시되지 않습니다. 기본 제어. 온다 바인딩 방법이 실행되어 데이터베이닝 이벤트가 발생하여 위의 코드가 실행됩니다.

ondatabinding을 재정의하면 기본 코드가 실행되기 전에 간단히 인수하고 Text 자신의 재산 (예를 들어).


나는 부분적인 답을주는 것을 싫어하지만, 그것이 깔끔하다고 생각하기 때문에 이번에는 할 것입니다. 그리고 그것은 최근에 저를 구했습니다.

나는 데이터 바인딩 발현이 구문 분석되었다고 말했다. 실제로 모든 마크 업은 구문 분석, C#, vb.net의 코드 또는 생성 된 언어로 코드가 있으며, 이는 클래스로 편집 된 것입니다. 페이지가 요청되면이 클래스의 인스턴스가 생성되고 수명이 시작됩니다.

디스크에서 생성 된 코드 파일을 찾을 수 있습니다 죄송합니다. 어디서 기억 나지 않습니다. 그들에 대한 흥미로운 점은 그들이 여전히 코드로 작동한다는 것입니다.

예를 들어, 최근에 나는 최근에 상당히 복잡한 Infragistics 그리드를 설정하고 모든 형식을 완료 한 다음 Rumtime에서 형식을 설정할 수 있어야한다는 것을 발견했습니다 (올바른 형식을 내보낸 Excel 파일로 가져 오려면). 이를 위해 소스 파일을 열었고 (모든 그리드는 단일 사용자 컨트롤에 있었음) 각 그리드의 구성을 별도의 메소드 그룹으로 추출 할 수있었습니다.

Resharper로 청소하고 공통 코드 시퀀스를 기본 클래스로 추출 할 수 있었으며 각 그리드를 설정하기 위해 하나의 정적 방법이 남았습니다. 그런 다음 초기 설정과 Excel 내보내기에 사용되는 더미 그리드 설정을 위해 둘 다 호출 할 수있었습니다.

다른 팁

나는 그 반대를 훨씬 선호합니다. 코드-비만을 절차 코드로 제한하고 모든 선언 코드를 ASPX 페이지에 유지하는 것을 선호합니다. 위의 예에서, 문자 그럴은 절대적으로 선언적이므로 (내 선호도에 따라) 코드-비만에 속하지 않습니다. 훨씬 더 강력한 기능은 일반적으로 내 코드-홀드에 들어가며, 이해하려고 할 때 많은 초기화 라인을 통해 개발자가 혼란스러워지기를 원하지 않습니다.

나는 ondatabinding으로 당신의 길을 선호합니다. 모든 ondatabinding 호출에 "Databind"영역을 사용하여 CodeBehind를 깨끗하게 유지할 수 있으며, 끔찍한 서버 측 코드 블록을 가져 와서 마크 업을 깨끗하게 유지할 수 있습니다.

나는 대부분의 사람들이 이해하고 구현하기가 더 쉽기 때문에 인라인 방식으로 그렇게한다고 생각합니다.

실제로 ListView, GridView, Repeater 및 기타 유사한 컨트롤과 같이 바인딩 할 컨트롤에 ASPX를 사용하는 것이 좋습니다.

다른 컨트롤을 위해, 나는 codebehind에 그것들을 설정했지만 직접 (전체 페이지의 literal.databind 또는 databind를 호출하는 대신 내가하고있는 프로세스의 일부로) 직접 설정했습니다. 사용자/사용자 정의 컨트롤 인 경우 발신자가 데이터 밴드를 수행 할 것으로 예상하면 Databind를 무시하고 값을 설정합니다.

즉, 나는 보통 CodeBehind 외부에 많은 코드를 가지고 있으며 Showuser와 같은 것을 호출하여 해당 과제를 컨트롤에 넣고 (속성을 설정하고, 바인딩을하고, 간단한 컨트롤을 위해 모든 eval을 갖습니다). .

나는 Caltrop에 동의합니다. 나는 내 마크 업이 깨끗하고 모든 ASPX/ASCX 코드가 내 코드-비만 파일 (위치)에 상주 할 것을 좋아합니다.

추가해야 할 것이 하나뿐입니다. 나는 각 데이터 패부 컨트롤에 연결된 ondatabinding () 이벤트로 내 코드를 쓰지 않는 것을 선호합니다. 대신 나는 바인딩 가능한 제어 (예 : 샘플의 리피터와 같은)에 포함 된 사용자 컨트롤의 ondatabinding () 이벤트에서 모든 것을 수행합니다.

예를 들어, 내 사용자 컨트롤의 코드 비밀에서 다음을 찾을 수 있습니다.

protected override void OnDataBinding(EventArgs e)
{
    base.OnDataBinding(e);

    litExample.Text = Eval("ExampleField") + " - " + Eval("ExampleField2");
}

여기에서 모든 컨트롤의 속성을 설정하거나 다른 방법을 호출하여 설정할 수 있습니다. 내 예에서 내가 여기서했던 것처럼 권투를 수행 할 필요가없는 방법에 주목하십시오. Literal lit = (Literal)(sender);

그것만으로도 일부 성능을 절약해야합니다 (물론 나노 초, 그러나 측정 할 가치가있는 것). 여기에서 "성능"섹션을 읽으십시오. http://msdn.microsoft.com/en-us/library/yz2be5wk%28v=vss.80%29.aspx

나는 또한 내 코드에서 문자열을 사용하는 것과 전쟁 중입니다. Const String 변수를 사용하여 "examplefield"및 "examplefield2"를 정의하거나 사용자 컨트롤에서 공개 속성으로 설정 한 다음 데이터 객체의 열 이름을 기반으로 포함하는 컨트롤/페이지에서 설정할 수있는 공개 속성으로 설정했을 것입니다. 반대하십시오. 이것은 컨트롤의 유연성과 재사용을 제공합니다.

참고 :이 메소드가 이미 문자열을 반환하기 때문에 Eval에서 tostring ()를 호출 할 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top