ASP.NET - 해당되는 글 5건

방법 1. http://www.jaredlog.com/?p=13


새로고침 방지할 적용할 페이지 단에 다음과 같은 코드를 추가하고 방지해야할 이벤트에 if문을 걸고 bool 타입의 IsRefresh 속성을 호출하여 새로고침시 이벤트 수행을 방지한다.

        private bool _refreshState;
        private bool _isRefresh;

        public bool IsRefresh
        {
            get { return _isRefresh; }
        }

        protected override void LoadViewState(object savedState)
        {
            object[] allStates = (object[])savedState;
            base.LoadViewState(allStates[0]);
            _refreshState = (bool)allStates[1];
            _isRefresh = _refreshState == (bool)Session["__ISREFRESH"];
        }

        protected override object SaveViewState()
        {
            Session["__ISREFRESH"] = _refreshState;
            object[] allStates = new object[2];
            allStates[0] = base.SaveViewState();
            allStates[1] = !_refreshState;
            return allStates;
        }


방법 2. http://cafe.naver.com/wml.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=103


게시판의 조회화면에서 새로고침을 할 경우 조회수가 증가하는 경우가 있다. 동일한 사용자가 같은 글을 조회할 경우 조회수 증가가 없도록 해야할 할 때 사용,
쇼핑몰에서 구매과정중 새로고침 현상으로 인해 발생할 수 있는 이중과금문제를 필할때,

다음과 같이 한 번 해보자.

public class Refresh : System.Web.UI.WebControls.WebControl  {

  bool _isrefresh = false;
  string _tname = "__Ticket";

  public Refresh() {
   if (HttpContext.Current == null) return;

   // Get Session and Request objects
   HttpSessionState S = HttpContext.Current.Session;
   HttpRequest R = HttpContext.Current.Request;

   // Change null to 0 (prevents errors)
   if (S[_tname + "_LastServed"] == null) { S[_tname + "_LastServed"] = 0; }

   // Get current and last ticket served
   int ticket = Convert.ToInt32(R["__" + _tname]) + 1;
   int lastticket = Convert.ToInt32(S[_tname + "_LastServed"]);

   // Refresh detection
   if (ticket > lastticket || (ticket == 0 && lastticket == 0)) {
    S[_tname + "_LastServed"] = ticket;
   } else {
    _isrefresh = true;
   }
  }

  protected override void Render(HtmlTextWriter output) {
   HttpSessionState S = HttpContext.Current.Session;
   Page.RegisterHiddenField("__" + _tname, S[_tname + "_LastServed"].ToString());
  }

  public bool IsRefresh {
   get { return _isrefresh; }
  }

  public string version {
   get { return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); }
  }
 }

<CC1:REFRESH id="Refresh1" runat="server"></CC1:REFRESH>


Trackbacks 2 | Comments 0
TreeView의 다중선택기능 공부하다가 궁금한게 생겨서 또 검색을 하고 말았다.

< Problem >
TreeView에는 TreeNodeCheckChanged 라는 체크박스 체크/해제 관련 이벤트가 있음에도
불구하고 CheckBox 계열 컨트롤들이 제공하는 AutoPostBack 속성이 존재하지 않는다.
   ==> 그래서, 체크박스를 체크한다해도 체크된 값을 페이지에 뿌려줄 수가 없다.

< Solution >

1. TreeView에 체크박스 속성을 설정한다. (All = 모든 노드에 체크박스)
<asp:TreeView ID="TreeView1" runat="server" ShowCheckBoxes="All"></asp:TreeView>

2. TreeView에 ontreenodecheckchanged 이벤트를 등록한다.
<asp:TreeView ID="TreeView1" runat="server" ShowCheckBoxes="All" ontreenodecheckchanged="TreeView1_TreeNodeCheckChanged"></asp:TreeView>

3. 비하인드 코드에서 TreeView의 체크된 노드의 값을 페이지에 뿌리는 코드를 작성한다.
 protected void TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
 {
        NodeText = "";       // 페이지에 뿌릴 string 변수 초기화 (public 전역변수 미리 선언)
        if (TreeView1.CheckedNodes.Count > 0)     // 체크된 노드가 있다면...
        {
            foreach (TreeNode tn in TreeView1.CheckedNodes)  // 변수에 값을 저장한다.
            {
                NodeText += "[" + tn.Text + "] ";
            }
        }
 }

4. TreeView에 onClick 이벤트를 설정한다. (기본 등록된 이벤트가 아님)
<asp:TreeView onClick="foo()" ID="TreeView1" runat="server" ShowCheckBoxes="All"
ontreenodecheckchanged="TreeView1_TreeNodeCheckChanged">

5. 디자인 페이지의 <Head> 태그 내에 클라이언트 스크립트를 추가한다.
<script>
    function foo()  // CheckBox 컨트롤에 doPostBack() 이벤트를 추가
    {
        var o = window.event.srcElement;
        if (o.tagName == "INPUT" && o.type == "checkbox")
        {
            __doPostBack("","");
        }
    }
 </script>

< 결과 View >
사용자 삽입 이미지

이상 끝 -_-.. 질문 사항은 댓글로 -_-/
Trackbacks 1 | Comments 0

ASP.NET 게시판을 만들면서 가장 짜증나는 두가지를 꼽으라면, 페이징과 검색일거다.
물론, 페이징이야 그리드뷰 쓰면 한방에 끝나기는 하지만, 검색은 따로 컨트롤이 지원되지 않는다.

검색을 구현하는 방법은 널리 사용되는 쿼리스트링 파라메터 전달 방법과,
SQL쿼리 문자열 조합을 생각할 수 있겠다.
내가 해보는 것은 좀 다른거지만.

먼저 조건 검색 디자인은 다음과 같이 가볍게 만든다. 아참... 데이터 바운디드 컨트롤은 GridView다.
구성요소는 검색조건 드롭다운리스트 1개, 검색어 입력할 텍스트박스 1개, 검색버튼 1개로 마치자.

사용자 삽입 이미지

이제 ASP.NET에서 지원해주는 SqlDataSource 컨트롤을 살펴보자.
SqlDataSource의 프로퍼티중 SelectCommand 라는것이 있다. 여기에 SELECT 쿼리를 담을수 있다.
기본적인 SELECT 쿼리는 아래와 같다.

"SELECT * FROM [T_BOARD_LIST] WHERE TITLE LIKE '%' + @CONT + '%' "

파라미터 @CONT는 텍스트박스에서 넣어줘야할 검색 조건이다. 잠깐... 파라미터로 값은 어떻게 넘기지?
SqlDataSource 태그 내에 <SelectParameters> 라는 태그가 있다. <SelectParameters> 태그 내에서
다시 <asp:ControlParameter> 라는 속성을 사용할 수가 있다. 다음과 같이...

<asp:ControlParameter ControlID="Textbox1" DefaultValue="%" Name="CONT" PropertyName="Text" Type=String />

CotrolID 속성은 값을 받을 컨트롤ID, DefaultValue는 파라메터로 넘길 기본값, Name 파라메터 이름,
PropertyName은 컨트롤ID의 속성명, Type은 파라메터의 타입이다. 이러면 감이 좀 잡히실거 같다.
코드로 굳이 풀어쓰자면, SqlCommand.Parameters.AddWithValue("@CONT", Textbox1.Text)
즉, 텍스트 박스 Text 속성에 저장된 값을 파라메터에 할당해주는 과정이다.


서두가 길었는데 아무튼 저렇게 되면 '제목'으로 기본 검색이 가능하다. 하지만 다중검색조건일 경우,
문제가 생긴다. 좀 하시는 분들은 WHERE절 조건 다음에 들어가는 컬럼명이 바뀌어야 한다는 것
직관적으로 파악하실 것 같다. 그래서 쿼리의 TITLE 부분을 파라메터로 받아야 한다.

이제 컨트롤들과 파라메터와의 전체적인 연계 코드를 보자. 주요 설명부분은 굵게 처리했다.

 <asp:SqlDataSource ID="SqlDataSource1" runat="server"
    ConnectionString="<%$ ConnectionStrings:TEST_BOARDConnectionString %>"
    SelectCommand="SELECT * FROM [T_BOARD_LIST] WHERE @SEL LIKE '%' + @CONT + '%' ">
       <SelectParameters>
            <asp:ControlParameter ControlID="ddl_search" Name="SEL" PropertyName="SelectedValue" />
            <asp:ControlParameter ControlID="txt_search" DefaultValue="%" Name="CONT" PropertyName="Text" Type=String />
       </SelectParameters>
 </asp:SqlDataSource>
  <asp:DropDownList ID="ddl_search" runat=server>
         <asp:ListItem Value="TITLE">제목</asp:ListItem>
         <asp:ListItem Value="WRITER">작성자</asp:ListItem>
  </asp:DropDownList>
        <asp:TextBox ID="txt_search" runat="server"></asp:TextBox>
        <asp:Button ID="btn_search" runat=server Text="검색" />

일단 드롭다운 리스트에 Value값을 준다. 그리고 첫번째 ControlParameter에서 드롭다운리스트의 선택값을 파라메터로 넘겨준다. 이걸로 검색이 되어야 하는데.... 정상적으로 안될 것이다.
이유를 알고 계신분들은 미리 비웃어주시기 바란다. 난 몰라서 2시간동안 검색해봤기 때문에...


 끝. THE END. -_-a.......... 추가 질문 사항은 덧글로 주세용 -_-/
Trackbacks 0 | Comments 2

ASP.NET / MS-SQL 실습중에 홑따옴표 (Single Quote)가 포함된 문자열에 대한
처리를 하다가 왠지 나중에라도 써먹을 거 같아 포스팅 한다.
<%#Eval("~~~")%> 코드는 .NET Framework 2.0 이상에서 적용 가능한 코드임을 미리 알려둔다.

<a title='<%#Eval("TITLE").ToString().Replace("'", "&#39;")%>'> 또는,
<a title='<%#Eval("TITLE").ToString().Replace("'", "`")%>'>

뭐, 별건 아니고 요지는 그거다 홑 따옴표는 예약어 이므로 걍 사용하면 문자열이 짤리니까,
HTML 문자의 싱글 쿼텟으로 치환을 해주라는거다. 아니면 1키 좌측에 있는 ` 로 치환하던지.

덤으로 MS-SQL에서의 홑따옴표 사용방법도 추가한다.

홑따옴표를 하나 더 써준다. '' 이렇게. 절대 " (쌍따옴표)가 아니다. 해보시면 안다.
ADO.NET 으로 쿼리문을 날릴때도 마찬가지로 문자열에 Replace("'", "''") 처리하면 된다.
Trackbacks 0 | Comments 0

가장 흔하게 등장하는 유효성 검사 예제를 살펴 보자.
버튼 클릭시 텍스트박스에 빈 값이 들어갔는지를 자바스크립트로 처리하려고 한다.


1. 디자인 페이지 (aspx) 에서 <head> 태그 내에 <script> 블럭을 추가하고 자바스크립트 함수를 만든다.
function fnc_Chk_Value(objTagName, strMsg)
{
   var rtnVal;
   var tmp;
 
   tmp = objTagName.value.replace(/\s/g,'');
   if(tmp == "")
   {
     alert(strMsg + ' 입력 하세요');
     objTagName.value='';
     objTagName.focus();
     rtnVal = false;
    }
    else
    {
      rtnVal = true;
    }
    return  rtnVal;
}

2. submit을 일으키는 버튼에 다음과 같은 속성을 추가한다.
<asp:Button ID="btn_OK" runat="server" Text="확인" onClientClick="return fnc_Chk_Value(텍스트박스 ID, '값을')" onClick="btn_OK_Click()" />

정리하자면...
onClientClick 이벤트에서 return 값을 반환하는 자바스크립트 함수를 먼저 실행해서
true를 반환하면 서버사이드의 onClick 이벤트를 실행하고,
false를 반환하면 onClick 이벤트가 실행되지 않도록 막는것이다.
Trackbacks 0 | Comments 0

microdesk's Blog is powered by Daum & tistory