UpdatePanel 안에서 ClientScript.RegisterStartupScript 를 그냥 쓰진 못한다.

아래와 같이 바꾸어 주면 된다.

(실행되지 않는 예)
string strScript = "javascript:alert('Testing')";
ClientScript.RegisterStartupScript(typeof(Page),"clientScript", strScript);


(해결법)
string strScript = "javascript: alert('Testing')";
ScriptManager.RegisterStartupScript(this.gridPanel, this.GetType(), "strScript", strScript, true);
참고:
Webparts
CSS Friendly Control Adapters

닷넷으로 개발을 하다보면 반드시 웹서버 콘트롤을 쓸 수 밖에 없는 경우가 생긴다. 그런데, 이 웹서버 콘트롤들이 웹표준을 따르지 않는 경우가 많다. 예를 들어서 불필요한 테이블 태그로 디자인을 한다거나 하는 경우 말이다. 또한 자주 쓰는 콘트롤 중에는 라디오박스 리스트, 체크박스리스트 등과 같은 리스트 콘트롤들이 있는데, 이걸 쓸데없이 테이블 태그로 감싸놓았다. 언제쯤 이런 콘트롤들이 CSS Friendly 하게 변하려나...

우얏든둥, MS에서는 이 사실을 인지하고 있는 듯 싶고, 공식적인 대응이라기 보다는 요 위의 코드플렉스 프로젝트인 CSS Friendly Control Adapters 를 이용해서 해결하려는 듯 싶다. 저걸 이용하면 많은 부분 해결을 할 수 있겠지만, 해당사항이 없는건 또 직접 만들어서 써야겠지.

아래 코드는 렌더링 상황에서 어떻게 테이블 태그를 없앨 수 있는지에 대한 내용이다. VB 코드로 짜놓은 거니 C#으로는 알아서 변형시키면 될 듯.

Public Class WebPartZoneControlAdapter
  Inherits System.Web.UI.WebControls.Adapters.WebControlAdapter

  Protected sw As StringWriter = Nothing
  Protected hw As HtmlTextWriter = Nothing

  Public Sub New()
    sw = New StringWriter
    hw = New HtmlTextWriter(sw)
  End Sub

  Protected Overrides Sub RenderBeginTag(ByVal writer As System.Web.UI.HtmlTextWriter)
    'MyBase.RenderBeginTag(writer)
  End Sub

  Protected Overrides Sub RenderEndTag(ByVal writer As System.Web.UI.HtmlTextWriter)
    'MyBase.RenderEndTag(writer)
  End Sub

  Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter)
    MyBase.RenderContents(Me.hw)

    Dim org As String = Me.sw.ToString()
	' Removes table, tr and td tags while rendering
    Dim html As String = Regex.Replace(org, "<[/]?(table|tr|td|[ovwxp]:\w+)[^>]*?>", "", RegexOptions.IgnoreCase)
    writer.Write(html)
  End Sub
End Class

그다음에 App_Browsers 디렉토리를 만들고 그 안에 form.browser 파일을 만들어 아래 내용을 집어 넣으면 끝.

[browsers]
  [browser refID="Default"]
    [controlAdapters]
      [adapter controlType="System.Web.UI.WebControls.WebPartZone" adapterType="WebPartZoneControlAdapter" /]
    [/controlAdapters]
  [/browser]
[/browsers]

비슷한 방식으로 하면 다른 콘트롤들도 렌더링 할 때 불필요한 테이블 태그들을 없앨 수 있다.

참 쉽지? ^^


출처 : http://blog.daum.net/justinsays/6603080


ASP.NET의 주요 명령어 정리 : 내장 개체

▶ Response개체 : 응답(서버(C#)에서 클라이언트(IE)로)
     .Write() : 페이지에 문자열 출력
     .Redirect() : 해당 페이지로 이동
     .Expires : 현재 페이지의 새로 고침 기능
          Response.Expires = -1; // 응답캐시 지우기
     .Buffer : 버퍼링 사용 설정
          Response.Buffer = true; // 버퍼링
     .Flush() : 현재 버퍼 내용 출력
     .Clear() : 현재 버퍼의 내용 비우기
     .End() : 현재 페이지 종료...
     .WriteFile() : 파일 출력
     .Cookies[] : 쿠키 저장
     
▶ Request개체
     .QueryString[] : 넘겨져 온 쿼리스트링값을 반환 : key/value쌍으로…
          Get방식 : URI(URL)에 ? 뒤에 키와 값으로 전달
     .Form[] : Post방식으로 넘겨져 온 값 반환
          Post방식 : HTTP 헤더에 데이터를 실어서 전송
     .Params[] : Get/Post 방식 중 아무거나 다 받음.
     Request[] : Params[] 컬렉션과 동일
     
     .UserHostAddress : IP주소
     .ServerVariables["REMOTE_HOST"] : IP주소
     .ServerVariables["REMOTE_ADDR"] : IP주소
     
     .Cookies[] : 저장된 쿠키 읽어오기.
     
▶ Server개체
     .MapPath(".") : 현재 파일과 같은 경로 값 반환 : .., /, \
     .Execute() : 다른 파일 포함(인클루드)후 제어권 돌아옴
     .Transfer() : 다른 파일 포함(인클루드)후 제어권 넘김 : Execute() + Response.End()
     .UrlPathEncode() : 넘겨져온 쿼리 스트링을 유니코드로 변환(한글 처리)
     .ScriptTimeout : 서버측에서 현재 ASPX페이지를 몇초간 처리할 건지 설정
          대용량 파일 업로드 페이지는 일시적으로 Server.ScriptTimeout을 증가
          
▶ Application개체
     - Application 전역 변수 선언(Public)
          Application["변수명"] = 값; // 딱 한개만 생성
     .Lock() : 애플리케이션 변수를 잠그는 메서드
     .UnLock() : 잠긴 애플리케이션 변수를 해제하는 메서드
     
▶ Session개체
     - Session 전역 변수 선언(Private)
          Session["변수명"] = 값; // 사용자 수 만큼 생성
     .Abandon() : 현재 세션 지우기
          예전에는 세션으로 로그인 처리시 로그아웃 할 때 사용
     .SessionID : 현재 세션의 고유번호 값 반환
          GUID와 비슷 : 한명이 접속하면 웹서버는 고유한 인증값을 부여
     .SessionTimeout : 세션 시간 기록 : 기본값 20분... 더 추가시키거나 줄일경우 사용...
     
▶ Page 개체
     .IsPostBack : 현재 페이지가 처음 로드했는지, 다시 게시(PostBack)되었는 지 확인
          처음로드 : Page.IsPostBack => false
          다시게시(PostBack) : Page.IsPostBack => true
     .RegisterClientScriptBlock() : 자바스크립트를 동적으로 웹 페이지에 추가
          Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "스크립트 구분 이름", "자바스크립트코드");
     .RegisterStartupScript() : 자바스크립트를 동적으로 웹 페이지에 추가
          Page.ClientScript.RegisterStartupScript(this.GetType(), "스크립트 구분 이름", "자바스크립트코드");
     
▶ System.Web.Security.FormsAuthentication 개체 : 인증 관련
     
     [1] .SetAuthCookie() : 인증 쿠키값 부여... 인증 처리
          .GetRedirectUrl() : 인증 받기 이전의 페이지 경로값 반환.
     [2] .RedirectFromLoginPage() : 인증 처리와 동시에 이전(인증 받기 전) 페이지로 이동
     [3] Page.User.Identity.Name : 인증된 사용자명, SetAuthCookie()에서 부여된 인증 쿠키값, Admin, RedPlus식
     [4] Page.User.Identity.IsAuthenticated : 인증(로그인처리)되었다면, true, 그렇지 않으면 false를 반환
     
▶ 상태관리
     서버에 저장 : 웹 애플리케이션 전체에서 살아있는 변수값 저장
          Application[] : 1개만
          Session[] : 여러개
          Cache[] : 1개만 빠른 메모리에 저장
     클라이언트에 저장
          ViewState[] : 웹 브라우저의 소스코드에 히든필드로 저장
          Response.Cookies[] : 웹 브라우저에 쿠키 저장
          Request.Cookies[] : 저장된 쿠키 읽어오기

▶ 캐싱
     <%@ OutputCache Duration="3600" VaryByParam="None" %>
          3600초 동안 현재 페이지를 캐싱(메모리에 처리 결과 담고 바로 출력)


Request URL: http://WebResource.axd?d=9n4PyABCLnJPx4xoU3nxwC4Kt15K3u-a245UfT6hW8JSf4r6suGuS1kEScfmyvro0&t=633739595980000000

로컬테스트 및 개발서버에서 정상적으로 되던것들이 리얼서버로 올라갔을때 위메세지 처럼 발생하는 에러를 가끔씩 보실 수 있습니다.

WebResource.axd 는 ASP.NET 2.0에서 기본적으로 제공하는 HttpHandler 로서 커스텀 컨트롤의 DLL 내에 embedded resource 로서 제공되는 .gif .js .htm 등을 반환하기 위해 추가된 기능입니다.
WebResource.axd 가 리소스가 포함된 DLL과 리소스의 ID를 query string에 포함시키고 이것을 암호화 하는데 디폴트 암호화 알고리즘이 (AES)Rijndael 알고리즘 입니다.

이 알고리즘은 ASP.NET의 기본설정은 암호화/복호화에 사용하는 키를 자동생성 합니다.
암호화 할 때 사용한 키와 복호화 할 때 키값이 다를경우 예외가 발생합니다.

예외가 발생될 경우

/WebResource.axd?d= .... 렌더링 할 때 사용한 (자동 생성된) 암호화 키와 실제 이 URL이 요청되었을 때의 (자동 생성된) 복호화 키가 다를경우 패딩예외가 발생하는 것입니다.

ASP.NET으로 구성된 웹 어플리케이션 서버가 L4 Switch에 의하여 Load Balancing 되는 경우..

- 웹 페이지 접속 시 ASP.NET 컨트롤에서 없던 오류날 경우

- 이미지가 액박 표시 되는 현상


이 경우 Fiddler를 통하여 페이지 요청 시 WebResource.axd 요청이 실패하는지 확인합니다.
해당 요청에서 문제가 있다면 서버의 이벤트 로그에는 다음과 같이 CryptographicException 오류가 발생하였는지 확인해보는 것이 좋습니다.


Event code: 3005
Event message: 처리되지 않은 예외가 발생했습니다.
Event time: 2010-07-26 오후 오후 1:05:45
Event time (UTC): 2010-07-26 오후 1:05:45
Event ID: 28188a45397841e499de7a4c38b4f4cd
Event sequence: 61
Event occurrence: 3
Event detail code: 0
 
Exception information:
    Exception type: CryptographicException
    Exception message: 패딩이 잘못되었으며 제거할 수 없습니다.
 
Request information:
    Request URL: http://WebResource.axd?d=9n4PyABCLnJPx4xoU3nxwC4Kt15K3u-a245UfT6hW8JSf4r6suGuS1kEScfmyvro0&t=633739595980000000
    Request path: /WebResource.axd

[패딩이 잘못되었으며 제거할 수 없습니다. (Padding is invalid and cannot be removed.)]


이 에러는 WebResource.axd 파일을 요청할 때 발생합니다.
이 파일은 ASP.NET의 컨트롤을 사용하는 경우 요청되는데요.
이 때 암호화 작업이 발생합니다. 암호화에 사용되는 Machine Key는 서버가 가지고 있습니다.
ASP.NET에서 Machine Key를 설정한적이 없다면 동적으로 생성되어 사용됩니다.

서버가 한대일 경우는 상관 없지만, 여러대 이면서 LoadBalancing을 하는 경우는 문제가 발생합니다. 요청마다 서버가 바뀌므로 암호화 키를 전달해준 서버가 아닌 서버가 암호화된 정보를 받는다면 해독할 수 없으므로, 위 처럼 오류가 발생하는 것이지요.


이는 모든 웹 어플리케이션 서버의 Machine Key를 동일하게 함으로 해결할 수 있습니다.
새로운 Machine Key 키 생성은 다음의 사이트에서 도움을 받으세요.

http://aspnetresources.com/tools/machineKey


생성된 Machine Key는 web.config에 다음의 형태로 삽입하면 됩니다.
 </system.web>
 <machineKey validationKey="D3373ECBFB7F1D94A57890DD8C676F5E925713E79BCF5A8A2692D408A5E9A1E06ED9FBF352B876D2B465EE70DDCF69CA2FD263711401ED6171ED5AC8F795E88A" decryptionKey="0B12BC1D697005FF915095556F3E528F261F5D08847AAB9881E409D525D1D5C6" validation="SHA1" decryption="Auto" />
 </system.web>

 

참고자료
-- machineKey 요소(ASP.NET 설정 스키마)
http://msdn.microsoft.com/ko-kr/library/w8h3skw9.aspx

 

 

출처 : http://inaekkuya.blog.me/70090690083


출처 동석이의 블로그 | 허둥사마
원문 http://blog.naver.com/tit99hds/120018010240

개요

페이지의 실행주기가 언뜻 아무것도 아닌것처럼 보이나 어떠한 복잡한 로직이 페이지에 구현될때

실행주기때문에 머리가 엉킨 경험을 한번씩은 경험 해 보았을 것이라고 생각합니다.

페이지의 실행주기를 한번만 확실히 집고 넘어가면 앞으로 개발하는데 많은 장점이 있을 듯 합니다.



<%@ Page Language="C#" Debug=true %>
<Script Language="C#" Runat="Server">
string s = "데이타 바인드 하기";
private void Page_Init(Object o , EventArgs e)
{
 Response.Write("Page_Init 이벤트 발생!<p>");
}
private void Page_Load(Object o , EventArgs e)
{
 Response.Write("Page_Load 이벤트 발생!<p>");
}
private void Page_PreRender(Object o , EventArgs e)
{
 Response.Write("Page_PreRender 이벤트 발생!<p>");
}
private void Page_Unload(Object o , EventArgs e)
{
 //페이지가 메모리에서 언로드 될때 발생, 아직 해제(disposed)되지는 않는다
 //응답을 사용할수 없다(Respnose개체 사용 불가)
 //화면에 출력하는 코드를 사용할 수 없다
}
private void Page_Disposed(Object o , EventArgs e)
{
 //페이지 생명주기 마지막 단계
 //페이지가 메모리에서 해제됨
}
private void DoClick(Object o , EventArgs e)
{
 Response.Write("클릭 이벤트 발생!(포스트 백 일어남)<p>");
 //Page.DataBind();
}
</Script>
<form runat="server">
 <asp:Button Runat="Server" OnClick="DoClick" Text="클릭!" /><p> <%# s %>
</form>

위의 코드는 페이지 실행주기동안에 발생하는 대부분의 이벤트입니다.

1. 페이지가 처음 로딩될 경우 [ init -> load -> PostBack체크 -> preRender 순으로 발생 ]


2. 포스트 백(버턴클릭시)이 될 경우 [ init -> load -> PostBack체크 -> 버턴클릭이벤트 -> PreRenader 순으로 발생 ]

주의 할 것은 포스트백이 일어날때 Page_Load 이벤트는 다시 호출되며 컨트롤의 
이벤트보다 먼저 수행된다는 점입니다. 
실수를 해보지 않은 사람은 다 아는 내용이지 않는냐 하겠지만 한번씩 실수를 해본 사람은 
이미 알고 있고 또한 기본적이지만 중요한 개념입니다. 
그리고 Page_PreRender 이벤트는 컨트롤의 이벤트 뒤에 또는 처음로딩시 호출되기에 
나름대로 유용하게 쓰일 수 있는 이벤트이기도 하죠. 
 
3.

private void Page_DataBind(Object o , EventArgs e)
{
    Response.Write("Page_DataBind 이벤트 발생<p>");
}
Page의 또다른 이벤트인 DataBind 입니다. 
이 놈은 페이지에서 DataBind 가 호출될때 발생하는 이벤트 입니다. ( ex> Page.DataBind(); ) 
이 외에도 실행주기에 대한 내용은 많지만 제가 아는 내용은 대략 이정도군요^^ 
 


페이지 요구시 처리과정

  1. init : 페이지 초기화
  2. ViewState복구
  3. Load : 일반적으로 알고 있는 Page_Load()
  4. PostBack 이벤트 처리
  5. PreRender
  6. ViewState 저장
  7. Render
  8. UnLoad : 페이지 객체 소멸 직전에 발생하는 이벤트


서버 컨트롤의 실행주기

  1. 컨트롤 생성
  2. Init
  3. ViewState 복구
  4. PostBack 데이터 처리
  5. Load
  6. 데이터 변경 이벤트
  7. PastBack 이벤트
  8. PreRenser
  9. ViewState 저장
  10. Render
  11. UnLoad

1. 단순 스크립트 블록일때.(cs파일에서)

string Script="<script language=javascript>";
Script+="parent.location.href='http://kr.yahoo.com';";
Script+="</";
Script+="script>";
------------------------------------------------------------- 자바스크립트 소스부분 스트링으로 선언

this.RegisterClientScriptBlock("OnStart",Script);
------------------------------------------------------------- 자바스크립트 실행 메소드

2. 메소드 스크립트 블록일때
aspx파일에서 스크립트 블록
<script language=javascript>
function test()
{
......( 메소드 내용);
}
</script>

cs파일에서 자바스크립트 메소드 호줄
private void Button1_Click(object sender, System.EventArgs e)
{
string method="test();";

Button1.Attributes.Add("onclick",method);

+ Recent posts