非数据库数据源分页的实现

主要代码:

把arraylist(或数组)的数据源绑定到repeater,并进行分页
+++demo++++
aspx
__________________________________________
<body>
<form id="form1" method="post" runat="server">
<font face="宋体">
<p><asp:repeater id="rtest" runat="server" datamember="1">
<itemtemplate>
<f color="#ff3366">
<%#container.dataitem%>
<br>
</f
</itemtemplate>
</asp:repeater></p>
<p>当前页:&nbsp;
<asp:label id="dq" runat="server">1</asp:label></p>
<p>
<asp:label id="link" runat="server">label</asp:label></p>
</font>
</form>
</body>
____________________________________________________

.cs
____________________________________________________________
public class t1 : system.web.ui.page
{
protected system.web.ui.webcontrols.label dq;
protected system.web.ui.webcontrols.label link;
protected system.web.ui.webcontrols.label d;
protected system.web.ui.webcontrols.repeater rtestt;
protected system.web.ui.webcontrols.repeater rtest;
private int pagesize;//每页显示的记录数目

public void page_load(object sender, system.eventargs e)
{
// 在此处放置用户代码以初始化页面
if(!page.ispostback)
pagesize=40; //每页显示的记录数目
this.rtest.datasource=datasource();//直接绑定到数据源
this.rtest.databind();
}

//设置arraylist,供arraylist datasource()调用
public arraylist data()
{
//++++给repeater构造数据源,长度变量为j+++++++++++++++++++++++++++++++++++++++++++++++++++++
arraylist s=new arraylist();
for(int j=1;j<100;j++)
s.add("aa"+j.tostring());
return s;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
}
#regi
private arraylist datasource()
{

arraylist s=data();
{
//再次构造一个arraylist,作为每个页面显示的数据
arraylist subs=new arraylist();
int rek=int32.parse(request.querystring["page"]);
dq.text=(rek+1).tostring();

//如果是能被整除,如总记录数为20,每页显示4条记录,所以就整除,要是每页显示3条记录,则在最后页为2条记录
if(s.count==pagesize*(s.count/pagesize))
{
for(int link=0;link<s.count/pagesize;link++)
{
response.write("页:<a href='#' /"+"a>";

}
}
//不能被整除的处理
if(s.count!=pagesize*(s.count/pagesize))
{
for(int link=0;link<(s.count/pagesize)+1;link++)
{
response.write("页:<a href='#' ) +">"+(link+1)+"</"+"a>";

}
}

//判断是否能记录是否能被页数整除
if(s.count==pagesize*(s.count/pagesize))
{
int k=rek;
if((k*pagesize)<s.count)
{
for(int i=(pagesize*k);i<(pagesize*k+pagesize);i++)
{
subs.add(s[i]);
}
}
}

//不能整除,对最后页的设置.如总记录数为20,每页显示3条记录,以下就设置就只显示最后也的那2条记录
if(rek==s.count/pagesize)
{
int k=rek;
for(int i=(pagesize*k);i<(s.count);i++)
{

subs.add(s[i]);
}

}

else
{
int k=rek;

{
for(int i=(pagesize*k);i<(pagesize*k+pagesize);i++)
{

subs.add(s[i]);
}
}

}
if(s.count==pagesize*(s.count/pagesize))
{
response.write("共"+s.count/pagesize+"页";
}
else
{
response.write("共"+(1+s.count/pagesize)+"页";
}
return subs;
}

}
#endregion

#region web 窗体设计器生成的代码
override protected void oninit(eventargs e)
{
//
// codegen: 该调用是 asp.net web 窗体设计器所必需的。
//
initializecomp
base.oninit(e);
}

/// <summary>
/// 设计器支持所需的方法 – 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void initializecomp
{
this.load += new system.eventhandler(this.page_load);

}
#endregion
}

思路:
建立个arraylist data(),储存所有的数据.
而arraylist datasource()则为从总的数据源中取要显示的某部分.
也就是你看到的当前页的数据.

实现方法:
首先找到当前页的开始位置i,(即s[i]中的i是几)和当前页结束时的i
并把他们添加到arraylist subs中
其中arraylist subs只储存当前页的记录.

主要变量声明:
pagesize 每页显示的记录数目
j 数据源的总记录数值(我设置的为99,因为1=j<100)

用途:
这样只要你把数据库中的记录查询后,把他添加到arraylist s里
就可以直接
pagesize=40; //每页显示的记录数目
this.rtest.datasource=datasource();//直接绑定到数据源
this.rtest.databind();
绑定,并分页.(也可以封装为一个组件使用)

说明:对datalist和datagrid的我还没研究.此方法是我偶想到的,具体的用法我会进步"开发".暂时首也需要带参数page.

解决ASP.NET上传文件大小限制

解决asp.net上传文件大小限制
对于asp.net,默认只允许上传2m文件,增加如下配置,一般可以自定义最大文件大小.

<httpruntime

executi

maxrequestlength="40960"

usefullyqualifiedredirecturl="false"/>

如果还不行,可以使用思归提供的方案:

我们在上传大文件时都遇到过这样或那样的问题。设置很大的maxrequestlength值并不能完全解决问题,因为asp.net会block直到把整个文件载入内存后,再加以处理。实际上,如果文件很大的话,我们经常会见到internet explorer显示 "the page cannot be displayed – cannot find server or dns error",好像是怎么也catch不了这个错误。为什么?因为这是个client side错误,server side端的applicati

handling server error when upload file too large

解决的方法是利用隐含的httpworkerrequest,用它的getpreloadedentitybody 和 readentitybody方法从iis为asp.net建立的pipe里分块读取数据

iserviceprovider provider = (iserviceprovider) httpcontext.current;
httpworkerrequest wr = (httpworkerrequest) provider.getservice(typeof(httpworkerrequest));
byte[] bs = wr.getpreloadedentitybody();
….
if (!wr.isentireentitybodyispreloaded())
{
int n = 1024;
byte[] bs2 = new byte[n];
while (wr.readentitybody(bs2,n) >0)
{
…..
}
}

ASP.NET程序员应用程序域须知

asp.net程序员应用程序域须知
本文将讨论.net的应用程序域,并且它们是如何对asp.net的执行和调度产生影响的。

  当在windows中启动notepad程序时,众所周知程序会执行一个包含在容器内的进程。可以启动多个notepad的实例,并且每个实例都会在一个专注的进行程运行。使用任务管理器,可以看到在系统中当前运行的所有进程的清单。

  一个进程包括可执行从操作系统中保留的在内存中的代码和程序数据。在进程之内只少有一个包含在进程之内的正在执行指令的线程,并且在多数情况下有多个线程。如果程序打开了任何文件或者资源,这些资源将属于这个进程。

  一个进程也有一个分界线。包含在进程之内的错误代码不能在当前进程之外的地区腐化。在一个进程之内很容易通讯,但是专业技术要求一个进程对另一个进程通讯是必需的。每一个进程也在一个特殊的上下文安全系统中运行,这个安全系统规定在机器和网络中进程做什么。

  一个进程是一个在windows 操作系统中独立运行的最小单位。这会给在一个单一服务器上对一大堆应用程序的isp提出一个问题。isp将会分离每一个在同一个服务器上的与另一个公司的应用程序干扰的asp.net应用程序。但是相关的发射和执行一个对成百上千的应用程序的过程成本禁止的。

  介绍应用程序域

  .net介绍一个应用程序域的概念,或者appdomain像一个过程,appdomain是既是容器又是边界线。.net运行时间使用 appdomain作为代码和数据的容器,就像操作系统一个过程作为代码和数据的容器一样。当操作系统使用一个过程来分离不整齐的代码时,.net运行时间使用一个appdomain来分离在一个安全边线内的代码。

  一个appdomain仅仅属于一个单过程,但是单个过程能够保持多重的appdomain。一个appdomain创建起来相对容易(与一个过程比较起来),并且与一个过程比较起来具有少的维护费用。由于这些原因,一个appdomain是isp(提供成千上万的应用程序)的很好的解决方案。每一个应用程序可以生存在一个独立的appdomain之内,并且许多这样的appdomain可以生存于一个单一的过程(节省费用)之内。

  appdomain

  在同服务器上创建了两个asp.net应用程序,并且没有任何特殊配置。会发生什么事情呢?

  一个单一的asp.net手工进程使asp.net应用程序变成两方面的主要程序。在windows xp和windows 2000中,这一程序被命名为aspnet_wp.exe,并且这一程序运行在本地的aspnet计数器的前后安全关系中。在windows 2003手工程序拥有w3wp.exe并且默认运行在networ service中。

  一个对旬可以进住在一个appdomain中。每一个asp.net应用程序将具有它自己的一套全局变量:cache, application进住进同一进程,.net appdomain是一个独立的单元。如果存有共享的或静态成员的类,并且那些类存在于两种应用程序之内,每一个appdomain拥有它自己的静态字段的备份—数据并不共享。每一个应用程序的数据和代码安全独立存在并且在一边界之内由appdomain提供。

  为了在appdomain之间通讯或者在appdomain之间交换对象,需要查看在.net中穿过边界的通讯技术,例如.net细微的或web 服务。

  对将appdomain作为边界思想的警告之一是asp.net应用程序在默认情况下会带着充分的信任运行。充分信任的代码可以执行本地代码,并且本地代码可以本质地在进程之内的任何内容。需要运行带着部分信任执行应用程序来约束存取不完整的代码并且对安全的appdomain验证所有代码。

  隐藏备份并且重新启动

  一旦一个集合加载到一个appdomain,没有办法从appdomain集合的办法。不过,从一个进程中移除一个appdomain是有可能的。

  如果将一个已更新的dll复制到一个应用程序的子目录中,从asp.net的运行时间知道有新代码要执行。既然asp.net不能将dll复制到已存在的appdomain中,它就会起动一个新appdomain。旧的应用程序域是“排水已停止”,那就是,存在的需要被允许完成执行并且一旦它们执行完成appdomain可以卸载。带有新代码的新的appdomain就会开始并且开始所有的新请求。

  典型地说,当一个dll加载进一个进程时,进程对dll加锁并且不能对磁盘的上的文件进行覆盖。不过,appdomain有一个众所周知的特点:隐藏复制那所有的允许保留在磁盘上的那些未被加锁的可替换的集合。

  运行时间对二进制子目录的带有shadow copy的asp.net进行初始化。appdomain将任何的加锁之前的dll从二进制子目录中拷贝到一个临时位置并且再将这些dll加载到内存。 shadow copy允许没有将网页在线的情况下对所有在二进制子目录中的任何dll进行重写。

  熟练掌握domain

  应用程序域替换os进程将为单独的.net结点单元。一个可理解的应用程序域将会给你一个在asp.net应用程序后的手工发生的概念。使用 appdomain类的currentdomain属性,可以检查关于代码正在运行的appdomain的属性,包括我们在此文章中讨论的shadow copy。