2010-05-30 2 views
0

결과를 보여주는 DataList와 호출기로 간주되는 Repeater가 있습니다. QueryString 매개 변수로 리디렉션하여 페이지 번호를 사용하기로 결정했기 때문에 북마크 할 수도 있습니다. 내 문제는 주로 UI에서 주로 발생합니다.asp.net의 DataList/Repeater에 대한 호출기 구현

window.location = url + pagenumber를 수행하는 JS 함수를 호출하는 onclick과 함께 DIV를 넣으면 어쨌든 JS를 통해 QueryString 연산을 처리해야하는데 이는 약간 지저분합니다.

ItemTemplate 내에서 LinkButton 객체를 사용하면 전체 div에 cursor : pointer가있는 동안 linkbutton이 클릭 될 때만 리디렉션이 발생합니다.

가장 좋은 방법은 무엇입니까? 미리 감사드립니다.

참고 : 필자는 자체 서버 측 페이징을 구현하는 데 많은 시간과 노력을 기울이고 싶습니다. 제 3 자 매뉴얼을 읽는 것보다 더 재미 있다고 생각합니다.

답변

0

마크 업 :

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SoruListe.ascx.cs" Inherits="SoruListe" %> 
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %> 
<%@ Register src="EtiketControl.ascx" tagname="EtiketControl" tagprefix="uc1" %> 
<script type="text/javascript"> 
    $(document).ready(function() { 
    if ($('.pageritem')) { 
      $('#pageritem-' + get_pagenumber()).addClass("pagerselected"); 
     } 
    }); 

    function soruyuac(id) { 
     var url = "SoruDetay.aspx?sid=" + id; 
     window.location = url; 
    } 

    function get_QueryString(fieldname) { 
     var qstr = window.location.search.substring(1); 
     var pairs = qstr.split('&'); 
     for (i = 0; i < pairs.length; i++) { 
      var keyval = pairs[i].split('='); 
      if (keyval[0] && keyval[0] == fieldname) { 
       return keyval[1]; 
      } 
     } 
    } 

    function set_QueryString(fieldname, value) { 
     var rawurl = window.location.href; 
     if (rawurl.indexOf('?') > -1) { rawurl = window.location.href.split('?')[0]; } 
     var qstr = window.location.search.substring(1); 
     var pairs = qstr.split('&'); 
     var foundit = false; 

     for (i = 0; i < pairs.length; i++) { 
      if (i == 0 && rawurl.indexOf('?') == -1) { rawurl += '?' }; ///Buraya kadar saglam görünüyo 

      var curpair = pairs[i].split('='); 
      if (curpair[0] == fieldname) { /// paramname'i al ama deger için yeni geleni koy 
       foundit = true; 
       rawurl += curpair[0] + '=' + value; 
       if (i != pairs.length - 1) { rawurl += '&' } 
      } 
      else { ///aynen geri doldur 
       rawurl += curpair[0] + '=' + curpair[1]; 
       if (i != pairs.length - 1) { rawurl += '&' } 
      } 
     } 
     if (!foundit) { rawurl += '&' + fieldname + '=' + value; } 
     /// 
     return rawurl; 
    } 

    function changepage(pagenum) { 
     window.location = set_QueryString('pg', pagenum); 
    } 

    function get_pagenumber() { 
     var pgn = get_QueryString('pg'); 
     if (pgn == null) return 1; 
     return pgn; 
    } 

    function skipfrom(from) { 
     window.location = set_QueryString('skip', from); 
    } 
</script> 

<div id="dvPager"> 
    <asp:Repeater ID="pagerSorular" runat="server"> 
    <ItemTemplate> 
     <div class="pageritem pagertext" id='<%# "pageritem-" + Container.DataItem %>' 
      onclick='<%# (Container.DataItem != "...")?("changepage(" + Container.DataItem + ");"): ("skipfrom(" + (this.PageNumber + 4) + ");") %>' > 
      <%# Container.DataItem %> 
     </div> 
    </ItemTemplate> 
    </asp:Repeater> 
</div> 

<asp:DataList ID="gridSorular" runat="server" Width="100%" OnItemDataBound="gridSorular_ItemDataBound"> 
    <ItemTemplate> 
     <div class="soruwrapper"> 
      <asp:HiddenField ID="hfSoruID" runat="server" Value='<%# Eval("ID") %>' /> 
      <div class="viewsbox boxtext"> 
       <b class="boxtext"><%# Eval("VIEWS") %></b> 
       <br />Okuyan 
       <hr /> 
       <div class='<%# "answersbox boxtext " + ((int.Parse(Eval("ANSWERS").ToString()) > 0) ? "isanswered" : "notanswered") %>'> 
        <b class="numtext"><%# Eval("ANSWERS")%></b> 
        <br />Cevap 
       </div> 
      </div> 

      <div class="item" onclick='<%# "soruyuac(" + Eval("ID") + ");" %>'> 
       <div class="soruheader" title='<%# Server.HtmlEncode(Eval("BODY").ToString())%>' > 
        <%# Eval("TITLE") %> 
       </div> 
       <div class="etiketwrapper"> 
        <uc1:EtiketControl ID="EtiketControl1" runat="server" /> 
       </div> 
      </div> 
     </div> 
    </ItemTemplate> 
</asp:DataList> 

서버 측 : 내가 쓴 내 자바 스크립트 쿼리 문자열 파서 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using DataLayer; 

public partial class SoruListe : System.Web.UI.UserControl 
{ 
    public int PageNumber 
    { 
     get 
     { 
      string strPgNum = Request.QueryString["pg"] as String; 
      if (!String.IsNullOrEmpty(strPgNum)) 
      { 
       int pgnum; 
       if (int.TryParse(strPgNum, out pgnum)) 
       { 
        if (pgnum <= 0) 
        { 
         return pgnum; 
        } 
        else 
        { 
         return 1; 
        } 
       } 
       else 
       { 
        return 1; 
       } 
      } 
      else 
      { 
       return 1; 
      } 
     } 
    } 
    public int PageSize { get { return 1; } } 
    public string PageName { 
     get 
     { 
      string url = Request.Url.ToString(); 
      string[] parts = url.Split(new char[]{'/'}); 
      return parts[parts.Length - 1]; 
     } 
    } 

    public void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public void SonSorular() 
    { 
     gridSorular.DataSource = BLL.SonSorular(300,300); 
     gridSorular.DataBind(); 
     /// 
    } 

    protected void CreatePager() 
    { 
     int pagenumber = this.PageNumber; 
     int start = 1; 
     if (PageNumber > 3) 
     { 
      start = pagenumber - 3; 
     } 
     int finish = pagenumber + 3; 
     int sorucount; 
     using (DataAccessDataContext db = new DataAccessDataContext()) 
     { 
      sorucount = db.Sorus.Count(); 
     } 

     List<string> pageritemlist = new List<string>(); 

     int c = start; 
     for (int i = 0; i < finish; i++) 
     { 
      pageritemlist.Add((c++).ToString()); 
     } 
     pageritemlist.Add("..."); 
     pageritemlist.Add(sorucount.ToString()); 

     pagerSorular.DataSource = pageritemlist.ToArray(); 
     pagerSorular.DataBind(); 
    } 

    public void ListAll() 
    { 
     CreatePager(); 
     int pagesize = this.PageSize; 
     int skip = this.PageNumber * pagesize; 
     ListSorular(skip, pagesize); 
    } 
    public void Popular() 
    { 

    } 
    public void Active() 
    { 

    } 
    public void Unanswered() 
    { 

    } 
    public void ListSorular(int skip, int take) 
    { 
     using (DataAccessDataContext db = new DataAccessDataContext()) 
     { 
      List<SoruGridView> sorular = (from s in db.Sorus 
              select new SoruGridView() { 
              ID = s.ID, TITLE = s.TITLE, BODY = s.BODY, TARIH = s.DATECREATED, VIEWS = s.VIEWS, ANSWERS = s.Cevaps.Count 
              }).Skip(skip).Take(take).ToList(); 
      gridSorular.DataSource = sorular; 
      gridSorular.DataBind(); 
     } 
    } 

    protected void gridSorular_ItemDataBound(object sender, DataListItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      HiddenField hfsoruid = e.Item.FindControl("hfSoruID") as HiddenField; 
      if (hfsoruid != null) 
      { 
       int sid; 
       if (int.TryParse(hfsoruid.Value, out sid)) 
       { 
        EtiketControl tagsctrl = (EtiketControl)e.Item.FindControl("EtiketControl1"); 
        tagsctrl.GetTags(sid); 
       } 
      } 
     } 
    } 
} 

있다