比如页面有一篇文章,我看完以后可以点击看下一篇,也可以点击上一篇。
    我通过sql语句“select top 1 * from xxxxx”,和viewstate实现了,
    点击多了还出现那个“禁止回发或回调”错误
    刷新一下就没事了,不定时的出现这种错误,虽无大碍,提示加入那句 “xxx=true”,但是加后还是那样
    这是怎么回事啊?还有我觉得这种方法很烂,我总觉得有更好的方法的,求那位高人指教,希望详细点的
 

解决方案 »

  1.   

    你可以取出当前页的标识性的ID,然后取出一条大于或小于当前ID的数据不是可以了吗
      

  2.   

    我加问一句。如果ID是unique类型的
    就像CSDN这样的67c05ec9-365a-43ff-ae44-375fef618b75
    怎么办尼?
    是数值的话是很好做的
      

  3.   

     #region// 取出上一篇下一篇文章
        public void BindNextUp()
        {
            showid = Convert.ToString(SQLUtil.CutIntFromStr(Request["showid"]));
            if (showid != null && showid != "")
            {
                sqls.Sys_Paras.Add(new SqlParameter("@logid", SQLUtil.FilerSql(showid)));
                DataTable dtnextup = new DataTable();
                string strNextUp = "select * from (select top 1 logid,title from dbo.space_MyReleased where  logid>case when (select count(*) ";
                strNextUp += " from dbo.space_MyReleased where  state=1 and delstate=0 and logid > @logid) > 0 then @logid else @logid - 1 end  order by logid)as a union ";
                strNextUp += "  select * from (select top 1 logid,title from dbo.space_MyReleased where  state=1 and delstate=0 and logid< case when ";
                strNextUp += " (select count(*) from dbo.space_MyReleased where state=1 and delstate=0 and logid < @logid) > 0 then @logid else @logid + 1 end  order by logid desc) as b ";
                sqls.Fill_DT(strNextUp, dtnextup);
                if (dtnextup.Rows.Count > 0)
                {
                    this.up.Text = "<a class='MsHref1'  href=MyLogLeft.aspx?showid=" + dtnextup.Rows[0]["logid"].ToString() + ">" + dtnextup.Rows[0]["title"].ToString() + "</a>";
                    for (int i = 0; i < dtnextup.Rows.Count; i++)
                    {
                        int upid = Convert.ToInt32(dtnextup.Rows[i]["logid"].ToString());
                        //判断传递的ID大小来显示上一篇下一篇
                        if (upid == Convert.ToInt32(SQLUtil.FilerSql(showid)))//查询ID相等的
                        {
                            this.netx.Text = "<a class='MsHref1'  href=MyLogLeft.aspx?showid=" + dtnextup.Rows[i]["logid"].ToString() + ">" + dtnextup.Rows[i]["title"].ToString() + "</a>";
                        }
                        else if (upid < Convert.ToInt32(showid))//查出ID小于ShowID的
                        {
                            this.up.Text = "<a class='MsHref1'  href=MyLogLeft.aspx?showid=" + dtnextup.Rows[i]["logid"].ToString() + ">" + dtnextup.Rows[i]["title"].ToString() + "</a>";
                        }
                        else
                        {
                            this.netx.Text = "<a class='MsHref1'  href=MyLogLeft.aspx?showid=" + dtnextup.Rows[i]["logid"].ToString() + ">" + dtnextup.Rows[i]["title"].ToString() + "</a>";
                        }
                    }
                } sqls.Sys_Paras.Clear();
            }
        }
        #endregion
    <!--上一篇下一篇-->
     <div  class="MLDiv3" >
         <div style="float: left"  >&nbsp;&nbsp;  « 上一篇:【<asp:Label ID="up" runat="server"/>】</div> 
         <div align="right" >下一篇:【<asp:Label ID="netx" runat="server"   ></asp:Label>  】&nbsp;&nbsp;</div>
     </div>
    判断了最后一条。和最前面一条。时候点击上一条还是最前面。或最后一条。
      

  4.   

    通常设计数据库的时候主键一定为数值型,否则在join表的时候会很麻烦。你所看到的CSDN的ID形式不一定是表的主键,可能是经过某种转换或HASH的值,也可能是表是这样结构:ID(int pk), UniqueId(nvarchar(xxx)你看到的ID), xxxxx, xxxx如果ID确实不是数值型,用SQL SERVER 2005可以给表强型加入行标做为数值型ID, 下面写一个很简单的存储过程:create procedure dbo.Article_Select
    (
       @inRowId   int
    )
    as
    begindeclare @newArticleTable table
    (
        RowId    int,
        title    nvarchar(6000),
        date     datetime,
        xxxx     xxxxx
    )declare @maxRowId  intinsert into @newArticleTable
    select row_number() over (order by ANYCOLUMN ) as RowId, 
                                                      title, 
                                                       date, 
                                                       xxxx
    from ArticleTableselect @maxRowId = max(RowId) from @newArticleTableselect RowId, title, date, xxxx, @maxRowId from @newArticleTable
    where RowId = @inRowIdend
    go存储过程返回给你的内容包括当前的ROWID和最大的maxRowId, 在程序中对比它们,控制RowID, 最小值为1,最大值为maxRowId,
    点‘前一篇’ RowID - 1, '下一篇' 则加1;也可根据存储过程返回的 ROWID 和 MAXROWID 决定是否继续显示‘前一篇’或‘下一篇’。 
      

  5.   

    超级简单。
    select Max(ID) from T where ID<5
    select Min(ID) from T where ID>5
      

  6.   

    1.你的什么错误没描述清楚。谁知道你的xxx=true是什么意思呢?2.关于有什么好方法实现上一条下一条的,9楼的方法就很好啊,简单有效,又不用管什么viewstate
      

  7.   

    这就跟分页一样的用row_number()给记录排个行号rownum,上一篇就是rownum-1,下一篇就是rownum+1,根据行号读取记录(第一条和最后一条做下判断)
      

  8.   

    上一条下一条这些语句是必须的啊,那不是还要用viewstate吗