欢迎光临
我们一直在努力

VS2005自带个人网站学习工具~研究 (1)-.NET教程,Asp.Net开发

建站超值云服务器,限时71元/月
vs2005自带了一个所谓”个人网站初学者学习工具”(简称tool了~),实质上这是个个人网站的建站系统,而它虽然不大,却已经包含了绝大多数.net 2.0的新特性,masterpage theme datasouce membership等等….在现在看petshop程序还是一头雾水的水平下,学习这个显然是明智的选择 呵呵

新建一个”个人网站学习工具”网站,按要求运行,系统会初始化数据库,按照提示在asp.net网站配置里建一个administrator帐户,就可以开始玩了

首先看看网站大体结构:
主页->简历 链接 相册 这个是网站主要功能 其实最主要的就是一个相册!
另外提供一个 注册 和几个管理页面
管理页面都放在admin目录中

从web.config入手~
第一次接触这个,感觉一切都很新鲜(废话~),,先看看网站的配置文件吧
在教程里看到,系统里有一个web.config的模板,里面很详细,但是也很麻烦,头次看很难明白~
这个tool里面的就好懂得多,下面开始分析:

首先是connectionstring
定义了两个connectionstring 一个是personal一个是localsqlserver
personal里面定义的是网站需要存储的东西,主要是相册和photo
而localsqlserver,就是用.net自带的一些服务所需要的数据库~他这里默认是在app_data下的一个文件,这个文件实质上也是一个数据库了,和上面没什么不同,只是对这个数据库的
(有时候不能运行和这个有关系)

很多操作都可以用现成的方法完成,比如成员服务 个性化信息服务等等,因为访问细节不需要来关心,因此连provider都不用指定,,,初学情况下用默认的就行了
还有一句<remove name=”localsqlserver”/>,这个是用来覆盖掉继承的来自上一级的localsqlserver的~上一级的定义在服务器上会有,是给没有web.config的网站用的默认配置

,在win目录下

<pages stylesheettheme=”white”/> 因此网站的默认theme就是white了,主题里包括default.css 系统会自动应用,因此不用每一页链接default.css
<customerrors mode=”remoteonly”/> 这一句是定义出错显示的东西,顾名思义就是用服务器的出错信息
mode可以改为off 或者 on 自定义出错页面 参考这个用法
<customerrors defaultredirect=”http://hostname/applicationname/errorstatus.htm” mode=”on”>
<error statuscode=”404″ redirect=”filenotfound.htm” />
</customerrors>

<compilation debug=”true”/> 可以调试~第一次调试运行弹出的对话框就是说的这个了

然后定义身份验证是forms 基于窗体 具体的先不谈(下面都这样,具体的都先不谈)\

<globalization一句 定义编码~

然后打开role管理服务
打开sitemaps服务,并且设置

然后还定义了一个path 叫admin,也就是admin文件存放的目录,并且指定administrators role可以访问 其他都不行 也就是后台了
就这些了

开始分析每个文件前,先看看网站的前台架构
整个网站都基于了default.master,这个master定义了页头和页角,用了sitemap,实际上所有的导航都是基于sitemap的,因此可以方便的扩展~用了两个menu和一个sitemappath,

样式控制都用css~
对了插一句,整个网站全部基于div+css~~~控制,而且也没有盲目使用,该用表格也用了表格(文章列表什么的),这样很不错
首页提供了登陆和每日照片
简历和链接比较基本,没有用到什么技术,就是两个普通页面~
照片提供了一个相册功能,albums.aspx列出了所有相册,通过handler.ashx?albumid=1&size=m访问相册~这里用了httphandle实际上是photos.aspx?alumniid=**
然后photos.aspx根据alumniid列出照片,点击在通过http://localhost:7301/website2/handler.ashx?photoid=1&size=s访问(和上面一样 实质上是

http://localhost:7301/website2/details.aspx?albumid=1&page=1)
注意一下,这里通过httphandle提供了类似一个照片缩略图的功能

还有一块儿就是管理功能,这里提供了创建相册,上传图片等等

不深入了 先开始default.aspx

右边都是静态页面,没什么可研究的,看左边
上面是一块loginarea,是一个loginview控件
定义了两个模板,<anonymoustemplate> 和 <loggedintemplate> 很好理解
(涉及membership的东西,暂时先不写 做个标记…………..)

左边的下面一块formview
只用了一个itemtemplate 实际上显示数据用的
绑定到objectdatasoure
绑定了几个值,
照片链接为 details.aspx?albumid=<%# eval(“albumid”) %>&page=<%# container.dataitemindex %>
照片的src为 handler.ashx?photoid=<%# eval(“photoid”) %>&size=m
照片编号为 <%# eval(“photoid”) %>
先看看objectdatasource里的东西
业务逻辑类是photomanage 只用了一个getphotos方法为selectmethod
去找到这个getphotos (有好几个,这里当然是没有参数的那一个)
getphotos的代码,先随机得到一个alblumid,然后调用哪个需要传入albumid的getphotos

getphotos函数: 这个直接用了ado.net访问personal数据库,它返回一个list<photo>,,其实就是一个很多个photo类组成的集合
也就是,getphotos 就是返回这个album里面所有的photo 放在一个集合里面,看看它是怎么工作的
通过sqlcommand调用了 getphotos 存储过程,传入的参数有@albumid和@ispublic
@albumid是传入的,@ispublic传入一个bool值,这个值通过当前用户是否在friends或者administrators组得到,在admin组或者在friends组就是false (这个@ispublic意思是”访问

者是public”)
通过datareader读出,然后写进list<photo> 三个字段(其实是photo类的属性),photoid,albumid,和caption
最后返回list
这里要看一下getphotos存储过程要完成些什么
选出photos,photo的albumid为传入参数,同时此photo对应album的ispublic为1或者对应album的ispublic与传入相同(即要么图片公开,要么图片不公开但是传入的参数是false,

也就是在admin或者friends组)
select *
from [photos] left join [albums]
on [albums].[albumid] = [photos].[albumid]
where [photos].[albumid] = @albumid
and ([albums].[ispublic] = @ispublic or [albums].[ispublic] = 1)
返回的应该是n条数 每条数据包含一条图片信息~包括binary

回到getphotos函数,list<photo>包含3个字段,photoid albumid caption
顺便再看一下photo类,这个是所谓的”业务实体”
这个在photo.cs里 相当简单,给了三个属性,就是上面那三个,并不包含图像的二进制数据,只是存储了几个id和描述

还漏了一个,随机得到一个alblumid用的函数getrandomalbumid()
选出非空的album 加入list,随机一个最大为list.count的数,取albumid~sql存储过程里还是有一不少技巧的~

这部分的绑定差不多就这样了~
下面解决两个问题,注意到,img的src指向那个文件,和page指向的那个<%# container.dataitemindex %>
1 <%# container.dataitemindex %>
container 顾名思义这里表示formview dataitemindex表示formview的数据项,也就是表示第几项数据,绑定的时候,是绑定在一个list<photo>上的,里面包含若干条photo数据,

具体显示哪一项是随机的
注意到formview属性里 ondatabound=”randomize” randomize方法代码里随机指定了fromview的pageindex,当前的页自然就能通过dataitemindex得到~

2 关于handler.ashx?photoid=<%# eval(“photoid”) %>&size=m
这个东西实现的是传入photoid和size 就返回一个图片,类似直接输入jpg的url一样~理解起来似乎要麻烦一点(不过很有用,特别是到ajax~)
有个东西里面介绍这个,http://msdn.microsoft.com/msdnmag/issues/02/09/httppipelines/
这个比较复杂,慢慢来 详细看看这个东西
要理解这个,首先需要了解一些http pipelines的东西,一个http请求发出,会有一段httpcontext,细节不关心,这个请求中间会经过一个http handlers的环节,这个环节会对请求的

文件进行处理,比如标准的http handler中有一条,对于扩展名为.aspx的文件,会调用system.web.ui.pagehandlerfactory来处理,也就是把其当成一个页面,对于.asmx文件,会调用

webservice的factory来处理,所以服务器认识这些文件(默认设置在本机machine.config和web.config中 win目录下那两个)
关注的是对于.ashx文件,它会调用system.web.ui.simplehandlerfactory
这个factory没有任何实现,当然就等我们去实现了~
还是先不关心细节,实现的方法就是在.ashx文件里加入<%@ webhandler language=”c#” class=”handler” %> 然后实现一个接口ihttphandler
里面只有两个成员isreusable和processrequest
msdn里还看到一种,在任意文件中实现ihttphandler接口,然后在web.config里面加入单独声明
<httphandlers>
<add verb=”*” path=”handler.aspx” type=”handlerexample.myhttphandler,handlertest”/>
</httphandlers>
实际上是把handler.aspx的handler定位到handlertest.dll文件的handlerexample.myhttphandler上,只要运行handler.aspx就会被handle
而用.ashx做法应该是这样 默认.ashx文件是定位到simplehandlerfactory,这个类没有实现但是可继承,加入<%@ webhandler language=”c#” class=”handler” %>就继承了

这个类到本文件下面的handler类…然后实现handler类即可,因此访问此.ashx文件就会用本文件的handler类来处理,不会影响其他的.ashx文件
isreusable是一个只读属性,返回true就行,否则其他实例无法调用(实际上这里其他实例不可能调用得到,因为继承和实现都在一个地方
processrequest()方法就是主要的实现了,由一个httpcontent参数,当然表示当前的httpcontent了
看程序:
设置content 因为需要把传入的content变成一个图片,所以做一些处理
然后获取传入的数据,先得到size值,然后得到photoid,不存在就用albumid,不论如何用photomanager里的getphoto或者getfirstphoto获取照片的二进制数据,放在一个stream

里,确保stream里有数据后,写如httpcontent 这段代码:
// 将图像流写入响应流中
const int buffersize = 1024 * 16;
byte[] buffer = new byte[buffersize];
int count = stream.read(buffer, 0, buffersize);
while (count > 0) {
context.response.outputstream.write(buffer, 0, count);
count = stream.read(buffer, 0, buffersize);
}
这样context被改变了,于是返回的时候就会返回stream,前面设置过类型是 image/jpeg 于是就相当于jpg文件了~
加一个 得注意context.response属性的设置,具体的还得再研究~

还差一个,再去看看getphoto和getfirstphoto做了些什么(其实就是根据参数返回数据库中的binary)
getphoto 如果没有传入photoid,也就是httpcontent中没有传入photoid,直接按照size返回现成的jpg,实质就3句话
string path = httpcontext.current.server.mappath(“~/images/”);
path += “placeholder-600.jpg”;
return new filestream(path, filemode.open, fileaccess.read, fileshare.read);
如果传入了photoid,就运行”getphoto”存储过程,返回的代码在这里~图片大小居然写在存储过程里了,传一个参数就行
object result = command.executescalar();
try {
return new memorystream((byte[])result);
} catch {
return null;
}
再看看存储过程,其实很简单,存储图片的时候就分别存储了4中不同size的图片,选的时候用就行了~所以说存储过程可以做不少事情……..

然后getfirstphoto 这个是从album中获取图片,其实差不多,存储过程不一样 本来是where photoid=@photoid现在成了albumid=@albumid 然后加个top 1


这就是数据库读取图片的实现~~~~~~

到这里default.aspx研究的差不多了,在研究到admin之前后面工作会轻松一些

注:photomanager.cs的内容穿插其中了,没有分开写

 

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » VS2005自带个人网站学习工具~研究 (1)-.NET教程,Asp.Net开发
分享到: 更多 (0)