第二个灵魂 发表于 2015-1-16 22:58:37

ASP教程之在Repeater控件中利用if语句

我想详细了解ASP整站代码与PSP整站代码有什么优缺点,那个更好,更安全,更用容易维护,和管理。。。控件|语句我比来正在写一个BBS的项目,在显现主题列表时,我碰到了一个成绩。BBS_Topic的数据表布局界说大抵是上面如许:

TABLEBBS_Topic
(
TopicIDINTNOTNULLIDENTITY(1,1)PRIMARYKEY,
TitleNVARCHAR(40),
AuthorNVARCHAR(20),
PostDateDATETIMENOTNULLDEFAULTGETDATE(),
ContentNTEXT,
ClickedINTNOTNULLDEFAULT0,
ReCountINTNOTNULLDEFAULT0,
LastReplyerNVARCHAR(20)
)

上面是ListTopic.aspx文件中的部份内容:

<asp:RepeaterID="_TopicRepeater"Runat="SERVER"DataSource="...">
<ItemTemplate>
<%#DataBinder.Eval(Container.DataItem,"Title")%>
<%#DataBinder.Eval(Container.DataItem,"Author")%>
<%#DataBinder.Eval(Container.DataItem,"Clicked")%>
<%#DataBinder.Eval(Container.DataItem,"ReCount")%>
<!--注重上面的if语句-->
<%if((int)(DataBinder.Eval(Container.DataItem,"ReCount"))==0){%>
----
<%}else{%>
<%#DataBinder.Eval(Container.DataItem,"LastReplyer")%>
<%}%>
</ItemTemplate>
</asp:Repeater>

利用if语句的目标是在于:判别以后帖子的复兴次数为0时,就将LastReplyer这项显现成“----”。而以后的帖子的复兴次数不为0时,则显现复兴人的名字。可是,如许的做法是行欠亨的。在IE中会呈现相似的告诫
编译器毛病信息:CS0246:找不到范例或定名空间称号“Container”(是不是短少using指令或程序集援用?)
即使,依据这个毛病提醒,将一切大概用到的定名空间全都Import到这个文件里,也仍是会提醒其他毛病信息的。至于为何如许?多是由于DataBinder.Eval和Container.DataItem同属Repeater类的成员的原因。“<%#%>”就是“感化”在Repeater上,可是“if...else...”语句则分歧,它是“感化”在全部页面上。这就象是在全局过程当中间接会见部分变量。固然,用相似上面(三目运算)的语句也能够完成上述功效:

<%#((int)(DataBinder.Eval(Container.DataItem,"ReCount"))==0)
?"----"
:DataBinder.Eval(Container.DataItem,"LastReplyer")%>

可成绩是,关于庞大的判别处置,如许的做法就相称坚苦了。
而<%#if...else...%>如许的用法又为何也不可呢?由于<%#%>相称于<%=%>,而<%=%>就是Response.Write(),那末后面的判别就显得好笑:
Response.Write(if...else...);
假如非要在Repeater中利用if语句来判别个中的数据,那末能够接纳上面的办法:

<%int_nIndex=0;%><!--界说一个一时的整型变量-->
<asp:RepeaterID="_TopicRepeater"Runat="SERVER"DataSource="...">
<ItemTemplate>
<%#DataBinder.Eval(Container.DataItem,"Title")%>
<%#DataBinder.Eval(Container.DataItem,"Author")%>
<%#DataBinder.Eval(Container.DataItem,"Clicked")%>
<%#DataBinder.Eval(Container.DataItem,"ReCount")%>
<%
intnReCount=(int)(((DataView)_TopicRepeater.DataSource).Table.Rows["ReCount"]);
//也能够分红几句来写
//DataViewDV=(DataView)_TopicRepeater.DataSource;
//DV.Table.Rows["ReCount"];
if(nReCount==0){%>
----
<%}else{%>
<%#DataBinder.Eval(Container.DataItem,"LastReplyer")%>
<%}%>
</ItemTemplate>
</asp:Repeater>

其基础思绪是,失掉_TopicRepeater的数据源(DataSource)
(说明:我在绑定Repeater的数据源时,利用的是DataSet.Tables["..."].DefaultView。假如利用的是其他的数据源,那末在给Repeater.DataSource强迫转型时,要略加注重)
并前往该表(Table)确当前行(Rows)最初判别ReCount列是不是为0?在最后的时分_nIndex被赋值为0,然后,在每次的ItemTemplate里都自加一次。其目标,也就是让_nIndex纪录以后正在会见的纪录“行”。
关于DataGrid和DataList,这个办法也是可行的。

最初,这个办法在举行庞大判别绑定命据时的确无效,可是我其实不保举如许的做法!由于如许的做法其实不切合面向工具的封装特征,大概说,它是以损坏了封装特征的做法使之通明,来完成判别功效的。我保举的做法是,利用“自界说用户控件”来完成庞大的判断绑定义务。

</p>Access是一种桌面数据库,只适合数据量少的应用,在处理少量数据和单机访问的数据库时是很好的,效率也很高。但是它的同时访问客户端不能多于4个。access数据库有一定的极限,如果数据达到100M左右,很容易造成服务器iis假死,或者消耗掉服务器的内存导致服务器崩溃。

深爱那片海 发表于 2015-1-20 07:02:05

代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。

灵魂腐蚀 发表于 2015-1-24 12:21:02

先学习用frontpage熟悉html编辑然后学习asp和vbscript建议买书进行系统学习

山那边是海 发表于 2015-1-30 07:56:01

Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点)

柔情似水 发表于 2015-2-6 09:02:53

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。

冷月葬花魂 发表于 2015-2-15 20:53:43

以HTML语言整合(HTML负责界面上,ASP则负责功能上)形成一个B/S(浏览器/服务器)模式的网页程序。

莫相离 发表于 2015-3-4 13:41:16

我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。

金色的骷髅 发表于 2015-3-11 19:52:01

先学习用frontpage熟悉html编辑然后学习asp和vbscript建议买书进行系统学习

蒙在股里 发表于 2015-3-19 10:42:59

下载一个源代码,然后再下载一个VBScript帮助,在源代码中遇到不认识的函数或是其他什么程序,都可以查帮助进行解决,这样学习效率很高。

谁可相欹 发表于 2015-3-27 20:09:58

接下来就不能纸上谈兵了,最好的方法其实是实践。实践,只能算是让你掌握语言特性用的。而提倡做实际的Project也不是太好,因为你还没有熟练的能力去综合各种技术,这样只能使你自己越来越迷糊。
页: [1]
查看完整版本: ASP教程之在Repeater控件中利用if语句