2009-04-11 3 views
1

사용자 지정 ASP.net 서버 컨트롤에 대해 생성 된 HTML 코드는 id 특성 대신 자식 컨트롤의 name 특성을 생성합니다. 이 같은 것 :고유 'ID'특성 대신 ASP.net 하위 컨트롤에 대해 HTML 'name'특성이 생성되었습니다.

<span id="GridView2_ctl02_editdis"> 
    <input type="text" name="GridView2$ctl02$editdis$ctl00"/> 
</span> 

사용자 지정 컨트롤 자체의 ID가 분명히 적절합니다.

내게 낯선 사람은 ID가 생성된다는 것입니다. 가끔 (어떤 조건에서 나는 잘 모름). 그러나 해당 ID가 FindControl() 인 경우 서버 측에서 null을 반환합니다. name 속성의 값이 FindControl() 인 경우 잘 작동합니다. 이 같은

뭔가 : 위의 경우

<span class="TextBox" id="GridView2_ctl02_editdis"> 
    <input type="text" id="GridView2_ctl02_editdis_ctl00" name="GridView2$ctl02$editdis$ctl00"/> 
</span> 

, 잘 작동 FindControl("GridView2$ctl02$editdis$ctl00"), FindControl("GridView2_ctl02_editdis_ctl00")하지 않습니다.

어떻게 일관되고 예측 가능한 ID를 보장합니까?

답변

3

일치합니다.

내부적으로 명명 컨트롤 (예 : GridView)의 자식 인 컨트롤에는 부모의 ID를 "$"로 추가하여 전체 ID가 생성됩니다. 그리드의 경우 gridID $ rowID $ cellID $ mycontrolID입니다. 이는 동일한 하위 컨트롤 (예 : mycontrolID)의 여러 인스턴스를 구별하는 데 필요합니다. 왜 "$"가 아닌 "_"입니까? 많은 사람들이 이미 자신의 컨트롤 이름을 "my_control_something"으로 지정하고 "$"기호는 다른 것보다 좋기 때문에 추측합니다.

그래서 GridView2 $ ctl02 $ editdis $ ctl00이 올바른 ID이므로 INPUT과 같은 컨트롤의 이름으로 사용됩니다. 포스트 백이 발생하면 프레임 워크는 양식 키를 적절한 컨트롤과 일치시킬 수 있어야합니다.

ID와의 혼동은 .aspx 내부에서 사용중인 ID와 HTML에서 볼 수있는 ID가 서로 다른 두 가지 사실이라는 사실에서 비롯된 것 같습니다. 클라이언트 측 ID는 바로 그것입니다. 어떤 이유에서든 컨트롤이 렌더링되면 (ClientID 속성 사용) 모든 "$"가 "_"로 바뀝니다. 내 생각 엔이게 javascript/css를 친숙하게 만들었습니다.

이제 FindControl ("GridView2 $ ctl02 $ editdis $ ctl00")에 대해 ... 가능하면 항상 피하는 것이 좋습니다. FindControl은 "GridView2 $ ctl02 $ editdis $ ctl00"을 "GridView2"및 "ctl02 $ editdis $ ctl00"으로 분할하고 GridView2를 찾고 자식 컨트롤로 "ctl02 $ editdis $ ctl00"이 있는지 확인하는 재귀 함수입니다. $로 구분 된 각 부분에 대해 프로세스가 반복됩니다.

참고로 깊이 묻힌 컨트롤을 위해 Page.FindControl을 호출 할 때마다 패턴을 검사하고 이유를 묻는 것이 좋습니다. 예를 들어, "GridView2 $ ctl02 $ editdis $ ctl00"으로 수행해야하는 작업은 "GridView2 $ ctl02 $ editdis $ ctl01"로 처리해야합니다. 이 경우 OnItemCreated 또는 OnItemDataBound에서 "ctl00"을 "알고있는"행에 대한 액세스 권한이있는 곳에서 처리해야합니다.

+0

흠. ASP.net 페이지에서 올바른 컨트롤로 포커스를 복원하려면 HTML ID (REQUEST [ "__ LASTFOCUS"]에서)를 사용하고있었습니다. 저는 이제 한 ID에서 다른 ID 로의 직접적인 변환이 없다는 것을 알고 있습니다. '_'을 '$'로 바꾸면 .net 버전간에 이식 가능합니까? – sandesh247

+0

실수가 아니라면 모든 .NET 버전은 HTML ID에 "_"을 사용하고 내부적으로 HTML 이름과 ID에 "$"를 사용합니다. – Ruslan

관련 문제