ASP.NET 미스테리

ASP.NET 미스테리

ASP.NET 미스테리

<<질문리스트>>

1.자바스크립트문제

- ASP.NET의 가장큰 문제는 Rendering된 HTML 테그들의 id가 자동생성된다는 점이다.

만약 프로그래머가 다음과 같이 aspx등에서 기술했다면

브라우저에서는 아래와 같은 모습을 보게될것이다.

사실 이것도 절대적인것은 아니고 부모 컨트롤이 무엇이냐에 따라 다시 바뀐다.

즉 디자인을 바꿀때마다 바뀐다고 보면 된다

(질문1)ClientID 즉 Html 테그의 id가 계속 바뀌는데 도대체 이 암호같은 id의 작성원칙은 무엇인가?

이게 왜 심각한 문제가 되냐면 id를 모르기 때문에 자바스크립트를 쓰기 어렵다는 점이다.

유일한 방법은 다음과 같다.

onclick="javascript:goAction(<%= 객체.ClientID %>)"

만약 자바스크립트 핸들러가 객체자신에 지정되어 있다면 당연하게도 다음과 같이 간단하게 기술할 수 도있다.

하지만 이런 경우가 얼마나 되겠는가

onclick="javascript:goAction(this)"

그런데, 이걸로도 해결되지 않는 경우가 있다

(질문2)무조건 clientID를 받아서 처리한다 하더라도

예를들어 개인정보입력화면에서 우편번호 버튼을 누르면 우편버호조회창이 팝업으로 뜨고

그 창에서 조회후 해당 우편번호를 클릭하면 개인정보입력화면의 우편번호입력란에 자동으로 우편번호를 입력받게 한다고 했을때

popup이 어떻게 opener.clientID를 찾아갈 수 있나?

(질문3)

예를 들어 체크박스가 약 20개 정도있고 맨앞에 전체라는 체크박스가 있다고 할때

전체 checkbox를 체크할때 나머지는 모두 deselected되어야 하는 상황을 해결해야 한다

단 checkbox는 웹서버컨트롤 또는 Html컨트롤이다.

그리고 이걸 서버사이드 이벤트로 처리한다면 수없이 화면이 reflesh되기 때문에 반드시 자바스크립트로 처리해야 한다.

어떻게 해결할 수 있는가?

(질문4)

데이타그리드를 엑셀 저장 하고 난후 자바스크립트에서 에러가 발생하는데 그 이유는?

참고로 엑셀 저장 하는 소스는 다음과 같다

HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";

HttpContext.Current.Response.AddHeader("Content-Disposition","attachment;filename="+ HttpUtility.UrlEncode(filename) + ".xls");

//Remove the charset from the Content-Type header.

HttpContext.Current.Response.Charset = "";

//Turn off the view state.

datagrid.EnableViewState = false;

System.IO.StringWriter tw = new System.IO.StringWriter();

System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);

//Get the HTML for the control.

datagrid.RenderControl(hw);

//Write the HTML back to the browser.

HttpContext.Current.Response.Write(tw.ToString());

//End the response.

HttpContext.Current.Response.End();

2.속도&성능

- ASP.NET은 속도가 빠르다. MS에서도 이걸 자랑으로 여기고 광고도 많이 한다.

문제는 이게 서버사이드 속도라는 점이다. asp/jsp에 비해 컴파일된 asp.net은 더 빠르다.

그럼 클라이언트사이드의 속도만 보면 어떤가?

더느리다.

왜냐하면 viewstate정보(__VIEWSTATE)와 더불어 자동으로 랜더링되는 웹컨트롤의 html소스의 사이즈가 더 크기 때문이다.

(질문1)ASP.NET을 쓰면 html소스가 커지면서 계속 무거우진다.

브라우저사이드의 성능에 악영향을 미치는바 html 소스를 경량화 할 수 있는 디자인 설계는?

속도와 성능의 문제는 웹프로젝트에서는 품질을 좌우하는 아주 중요한 이슈다

따라서 소스를 경량화시킬수 있는 방법을 다동원한다음에 다음과 같은 방법도 고려해 볼 필요가 있다

방법1. Smart Navigation

방법2. Caching

방법3. HTC

방법4. 웹Pooling

방법5. IFrame

(질문2)

Smart Navigation썼을때 문제가 생기기도 한다.

예를 들어 Virtual Net을 썼을 경우가 그렇다.

Smart Navigation을 쓸때의 주의할점은?

(질문3)

파라메터 Caching를 쓸수도 있으나 서버쪽에 부하를 얼마나 주는지가 관건일것이다.

검색화면의 경우 수없이 많은 경우의 수가 있는데 그걸다 서버사이드에서 caching할 수 있는가는 의문이 아닐수 없다

Caching을 모니터링 방법이 있는가?

(질문4)

HTC를 도입하는 것은 어떤가?(HTC에 대해서 모르면 inek forum을 본다)

MS가 TreeView등은 제공하나 가장많이 쓰는 DataList나 DataGrid에 해당하는 HTC를 MS가 제공하고 있지 않다.

공개프로젝트에라도 있는가?

또 MS가 더이상 HTC를 지원하지 않는다고 MSDN에 공시하고 있는데 어떤 이유로 그런가?

(질문5)

웹서버Pooling을 할려면 StateServer를 쓸때와 ViewState변수에 객체를 저장 할때 Serialization 문제

[Serialize]어트리뷰트를 사용해도 Serialization되지 않는 경우가 있는데 왜 그런가?

Serialization되고 않되고의 정확한 기준은 무엇인가?

3.상태유지

- Web은 비연결성에다 1회성이다. 그럼에도 불구하고 ASP.NET은 웹페이지의 상태를 유지한다. 아주편리한 기능이다.

하지만 상태유지는 꼭필요할때만 써야 한다. (이유에 대해서는 [2.속도&성능]을 참조한다)

APS.NET은 EnableViewState가 "true"이다.

항상 EnableViewState="false"로 셋팅하고 시작하고 필요한 경우에만 true로 변환한다.

아주 중요하다. 나중에 일괄로 할 수 있는 문제가 아니다.

(질문1)

왜 PlaceHolder는 상태유지가 되지않나? 그럼에도 불구하고 EnableViewState속성은 뭐하러 있나?

(질문2)

상태유지가 되는 웹컨트롤과 상태유지가 되지 않는 웹컨트롤의 기준은 무엇인가?

(질문3)

자바스크립트로 조작해도 상태유지가 되는 객체와 그렇치 않은 객체의 기준은 무엇인가?

예를 들어

웹서버컨트롤 ListBox에 자바 스크립트 ListBox.add()메소드로 데이타 1건을 추가한다음

서버로 이벤트 발생시켜서 디버깅해보면

ListBox.Items.count가 0건이 나온다

EnableStateView는 True로 셋팅해봐도 마찬가지다

이것의 이유는 자바스크립트로 조작한 데이타가 ViewState에 저장 되지 않기 때문이다

하지만 DropDownList나 ListBox의 SelectedIndex 프로퍼티는 포스트백시에 서버측으로 전달이 잘된다.

또 TextBox의 value도 마찬가지로 서버측으로 전달이 된다

(질문4)

Page객체에 있는 EnableViewState속성과 웹컨트롤등에 있는 EnableViewState속성과의 관계는?

Page객체의 EnableViewState속성값에 유저컨트롤이나 웹서버컨트롤의 EnableViewState속성이 강제로 종속되나?

4.이벤트

(질문1)

DataList안에 다시 DataList를 바인딩했을때 child DataList의 멤버 객체들의 이벤트는 어떻게 핸들링해야 하는가?

(질문2)

이벤트핸들러가 원인미상의 원인으로 삭제되는 경우가 있다. 무엇이 문제인가?

물론 프로그래머가 명시적으로 코딩하는 방법도 있으나 다음과 같은 문제가 있다

(1)디자이너에서 더이상 지원하지 않고

(2)실수로 이벤트핸들러를 두번 지정하게 될 수 있다

5.권한

(질문1)

파일의 권한에 aspnet계정을 추가하고 full권한을 줘도 access deny가 되는 경우가 많다.

그때는 어쩔수 없이 everyone계정을 추가하고 full권한을 주는데 aspnet계정으로 권한을 줘도 않되는 경우는 어떤 경우인가?

6.ASP.NET디자인 모델

(질문1)

코드 비하인드를 사용할 수 있음에도 불구하고 여전히 소스코드는 복잡하게 나온다. 어떤 디자인모델이 가장 적당한가? 상속? 클래스생성?

(질문2)

에러를 처리하는 가장 쉬운방법은 global.asax에서 처리하는 것이다.

그런데 이 방법은 전체페이지를 error페이지로 redirect시켜야만 한다

전체 페이지 redirect가 아닌 화면의 일부 영역에만 사용자 메세지를 보여주기 위해 가장 좋은 방법은?

7. DataBinding

(질문1)

DataBinding 시킬때 되는 경우가 있고 않되는 경우가 있는데, 도대체 기준이 뭔지 모르겠다.

실례A

datalist에 바운드되는 WebControl에 디자인타임에 자바스크립트 function 연결하기

런타임에 계속 에러난다.

그렇다고 코드바하인드에서 아래와 같이 해도 않된다

codebehind test #1

ListItem lt1 = new ListItem("국내서", "K");

//ASP.NET이 랜더링을 못한다

lt1.Attributes.Add("onclick" , "alert('ok!)");

rbList.Items.Add(lt1);

codebehind test #2

//ASP.NET이 랜더링을 못한다

foreach(ListItem lt in rbtnlist.Items)

{

lt.Attributes.Add("onclick" , "alert('ok')");

}

해결책:

veiw에서 onclick="javascript:alert('ok');"을 빼고 아래와 같이 이벤트처리로 해결

private void BBSList_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)

{

((LinkButton)e.Item.FindControl("lbtnDeleteBBS")).Attributes["onclick"] = "javascript:alert('ok');";

}

실례B

DropDownList에 DataBinding 할때 항목별로 style주기

10

20

30

이것을 아래와 같이 나타내고자 한다면

10

20

30

비하인드 코드에서

cbTest.Items[0].Attributes.Add("style","BACKGROUND: White; COLOR: #006699; text-align: right;");

또는

cbTest.Items[0].Attributes["style"]="BACKGROUND: White; COLOR: #006699; text-align: right;";

이렇게 해봤자 않됨

그렇다고

foreach(ServiceIndexDefEntity idxEnt in itemList)

{

ListItem lt = new ListItem(idxEnt.Label , idxEnt.IndexID);

lt.Attributes.Add("style" , "BACKGROUND: White; COLOR: #006699; text-align: right;");

cbTest.Items.Add(lt);

}

해결책:

HtmlControl을 쓴다. 하지만 HtmlControl은 서버사이트 이벤트를 지원하지 않는다

8.기타

(질문1)

DataList나 DataGrid를 써서 데이타를 표시한다.

만약 데이타가 없으면 "데이타가 존재하지 않습니다"라는 메세지를 DataList 또는 DataGrid자체에 보여주고자 한다

어떤 가능한 방법이 있는가?

(질문2)

ASP.NET v.20에서는 skin을 지원한다고는 하지만 아직 출시되지 않은 관계로 우선 v.10에서 어떻게 구현해야 하는지?

(질문3)

기존프로젝트를 Visual Studio.NET의 초기페이지에서 지우기

(질문4)

웹디렉토리를 만들어서 작업하다보면 _vti_cnf/_vti_pvt/_vti_script/_vti_txt등의 폴더들이 생성되는데 정체는?

from http://csslab.tistory.com/14 by ccl(A) rewrite - 2020-03-07 10:56:34

댓글

이 블로그의 인기 게시물

HTML 13단계 - 폼(Form) 1탄

임시 인터넷 파일캐싱을 위한 방지 html,css,javascript

[C#]Log4Net 사용법