ASP.NET 分页中的搜索条件以什么方式存储最好,cookies太麻烦

flyso 2011-10-17 10:02:31
ASP.NET 分页中的搜索条件以什么方式存储最好,cookies太麻烦,老是刷新不即时,要刷两次才出正确的结果

因为一般列表页,都有很多种搜索方式,常见的三种。
1.比如地址栏过来的搜索条件也就是url方式,
2.也有按钮提交的搜索也就是post方式,
3.还有DropDownList跳转后的方式

我用cookies存储的时候在每种搜索方式都要进行相应的处理,进行再次刷新才能出正确的结果,不然都得刷新两次,或搜索两次才能出正常的结果!

请高手指点下,给个最好的方式,最好能详细点!
...全文
873 47 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
leleyjg 2014-07-01
  • 打赏
  • 举报
回复
引用 20 楼 bossma 的回复:
[Quote=引用 18 楼 flyso 的回复:] 我把ViewState换成session,其它代码全不变,翻到第2页就是正确的结果,但是ViewState就不行,输出ViewState的值发现是空,难道ViewState不能像session和cookies那样保持状态,我并没有对他进行赌空值处理,怎么就把值给丢了呢 [/Quote] ViewState保存在当前页面中,Seesion保存在服务器,Cookie保存在浏览器,ViewState进入一个新的页面,当然就没了。
说得好,谢谢
wollpo 2011-12-22
  • 打赏
  • 举报
回复
汗.楼主玩冒险的么...
潇洒王子 2011-10-20
  • 打赏
  • 举报
回复
viewstate,和session都不怎么靠谱。viewstate只能在当前页有用,session过多的使用,不及时释放的话,会影响性能。
  • 打赏
  • 举报
回复
如果对于数据定义的范畴都会出错,这是很严重的设计bug。你们再会凑一些编程语句,这也从另一个方面说明你们公司不会进行测试。如果进行测试,当然要测试在一个会话中出现并发访问的情况,看看程序会不会因为不该共享数据时去相互冲突而混乱。把一个测试程序,使用两个并发线程来测试,这是发现程序思路混乱的最简单的测试。
  • 打赏
  • 举报
回复
晕!

还什么cookie、Session。你的条件是页面局部的,还是整个会话全局的?如果是全局的,我想你的老板不炒你那么他的用户、或者将来维护成本也就会炒了他了。
happytonice 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 pittroll 的回复:]

引用 21 楼 flyso 的回复:
还是当前面啊,就是翻了一下页,page1.aspx?page=1变成page1.aspx?page=2 而以,这样也不行?

恩,这样不行,这样相当于页面跳转到新页面了,原页面的viewstate丢失了。这样的话,就用session或者cookie了。
[/Quote]
是这样的
krenyelang 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 somethingjack 的回复:]
session可以不- -
[/Quote]

Session就像一颗定时炸弹一样!
还是少用他!
flyso 2011-10-17
  • 打赏
  • 举报
回复
不光要点搜索两次,我发现viewstate不能保持状态啊,翻了一页之后,这个viewstate就不存在了
CqCoder 2011-10-17
  • 打赏
  • 举报
回复
aspnetpager分页控件+存储过程分页
g4_magicvr 2011-10-17
  • 打赏
  • 举报
回复
你可以试试隐藏域 思路跟url一样 但是客户不会再看见这个记录 审美上好不少
flybisu 2011-10-17
  • 打赏
  • 举报
回复
地址栏最实际吧
flyso 2011-10-17
  • 打赏
  • 举报
回复
改用了viewstate,怎么还是得搜两次搜索按钮才能搜出正确结果

protected void btn_search_Click(object sender, EventArgs e)
{
Pager.intPageNo = 1;
string fields = ddl_field.Text.ToString().Trim();
string Key = tb_key.Text.ToString().Trim();
string str_flyso = fields + " like '%" + Key + "%'";
ViewState[tablename] = HttpUtility.UrlEncode(str_flyso);
}

//........................
protected void Page_Load(object sender, EventArgs e)
{
if (Request.Cookies["Admin"] == null)
{
Response.Write("<script>window.parent.window.location.href='login.html';</script>");
}
Pager.intPageSize = 10;
if (Request["CurrentPage"] == null)
{
Pager.intPageNo = 1;
}
else
{
Pager.intPageNo = Int32.Parse(Request["CurrentPage"]);
}
//初始变量
string str_Condition = "";
try
{
str_Condition = HttpUtility.UrlDecode(ViewState[tablename].ToString());
}
catch
{
str_Condition = "";
}

if (!IsPostBack)
{
if (Request["CurrentPage"] == null && Request.QueryString["act"] == null && str_Condition != "")
{
ViewState[tablename] = "";
Response.Redirect(pagename);
return;
}
}
Response.Write(str_Condition);
try
{
分页代码省略
}
//失败处理
catch //(Exception ex)
{
//Response.Write(ex.Message);
Response.Write("数据库连接出错!");
Response.End();
}
}
Lisliefor 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 flyso 的回复:]

session太容易超时了,受服务器的影响,地址栏肯定不行,不安全,上面那么多参数也不好看!而且翻页的时候那样参数还得传进去
[/Quote]

我觉得还是得看实际情况吧!
1. 放地址栏里面是最方便的,虽然放上去不好看,安全方面,可以写程序的过程中来弥补,比如说,在查询前做一些校验,过滤掉一些非法的参数。
2. 放到session里面比较省心,不过前提是没有在iis里面做负载均衡,如果涉及到多台web服务器,而你的session是放在服务器内存里面,状态容易丢失;如果只是单台的web服务器,放session里面也是比较方便的。
3. cookie的话,放得最长久,哪怕你关闭了浏览器,刷新不及时的问题应该是你操作cookie有误所导致,操作cookie要注意几个方面:
1). cookie是通过domain和path来控制作用范围的,尤其是后面那个属性,js中经常操作cookie失效,主要是由于没有设置path的原因
2). 如果你通过asp.net后台的response来设置cookie,那么,要注意response只有返回到客户端,才能影响cookie的值,如果是ajax的方式,可能你在服务端已经设置了cookie,但是它这个响应没有返回客户端,导致客户端的cookie并没有被修改。
4. 如果在webform下,用viewstate是个不错的选择
5. 如果使用asp.net mvc,用ViewData来缓存查询条件吧
PitTroll 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 flyso 的回复:]
session太容易超时了,受服务器的影响,地址栏肯定不行,不安全,上面那么多参数也不好看!而且翻页的时候那样参数还得传进去
[/Quote]
只要不跳到其他页面上,用viewstate还是可以的,
flyso 2011-10-17
  • 打赏
  • 举报
回复
session太容易超时了,受服务器的影响,地址栏肯定不行,不安全,上面那么多参数也不好看!而且翻页的时候那样参数还得传进去
周煜皓 2011-10-17
  • 打赏
  • 举报
回复
viewState
session
地址栏
就这么多了。。。最常用还是 地址栏咯!
SomethingJack 2011-10-17
  • 打赏
  • 举报
回复
session可以不- -
弦弦 2011-10-17
  • 打赏
  • 举报
回复
viewState
woshimaikou 2011-10-17
  • 打赏
  • 举报
回复
效率最好的还是URL分页,如果非要用另类的方法用Cache也可以
import xyzs 2011-10-17
  • 打赏
  • 举报
回复
我只是一个菜鸟,但是我们做项目用分页的时候有两种方式,1、利用sql语句进行分页,例如:select top PageSize from Nuser where id not in(select top ((currpage - 1) * PageSize) id from Nuser order by id) order by id;其中PageSize表示每一页显示多少条数据,可以用int的类型代入,currpage表示当前是第几页,当不能等于0或小于0!然后我们可以利用两个按钮来控制currpage来进行分页!虽然这种方式是把数据分成几部分读取,速度不是很快,因为你每一按上一页或者是下一页的时候都要进行数据库的访问,但是无论你这是开发C/S还是开发B/S的都可以用这种方式,并且这种方式可以结合第三方控件使用!个人建议:你是开发ASP或者ASP.NET的话最好自己做个自定义控件!
2、利用第三方控件!我个人建议利用第一种方式比较好!
但是如果是以一次性读取数据库里的数据,再进行分页的话,建议保存在Session中,Session的时间我们可以修改,ViewState也可以,但是要知道ViewState是不可以在窗体之间中传递的,因为ViewState这是保存在当前页面中的!而Session可以保存一个实体类,个人觉得还是Session好!地址栏的话不好看而且还浪费时间!
加载更多回复(27)

62,242

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧