此处提供的代码用来实现当asp.net页面中的某个Button被点击后disable掉该页面中所有的Button,从而防止提交延时导致 的多次提交。基于之前的onceclickbutton脚本.
//ASP.NET中防止页面多次提交的代码:javascript< script language=”javascript”> < !– function disableOtherSubmit() {
var obj = event.srcElement;
var objs = document.getElementsByTagName(‘INPUT’);
for(var i=0; i< objs.length; i++)
{
if(objs[i].type.toLowerCase() == ’submit’)
{
objs[i].disabled = true;
}
}
} //–> < /script>//ASP.NET中防止页面多次提交的代码:asp.netpublic class PreventMultiClick : System.Web.UI.Page {
protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Button Button2;
protected System.Web.UI.WebControls.LinkButton LinkButton1; protected System.Web.UI.WebControls.Button Button3; private void Page_Load(object sender, [...]
【asp.net】标签文章列表
ASP.NET中防止页面多次提交的代码实现
用Asp+XmlHttp实现RssReader功能
<style>
body {margin:10px;background-color:#ffffff;margin-top:6px;}
form{margin:0px;}
* {font:12px tahoma;line-height:140%;color:#000000}
.title {font-weight:bold;color:red;}
.time {font:10px;color:#999999;}
a {text-decoration:none;color:blue;}
</style>
<script type=”text/javascript”>
var switcher=0;
</script>
<body ondblclick=”if(switcher==0){document.styleSheets[0].addRule(‘div’,’display:none’);switcher=1}else{document.styleSheets[0].addRule(‘div’,’display:block’);switcher=0}”>
<form name=”rssform” method=post action=””>
RSS资源:<INPUT TYPE=”text” NAME=”RssFeed” size=60 style=”height:22px” value=”<%=request(“RssFeed”)%>” onfocus=select()> <input type=”submit” value=”Read It”> 双击鼠标可以关闭摘要,只显示标题
</form>
<hr/>
<%
If(request(“RssFeed”)=””) Then
url=”/rss2.asp”
else
url=request(“RssFeed”)
End If
Set xml = Server.CreateObject(“Microsoft.XMLHTTP”)
xml.Open ”GET”, url, False
xml.Send
Set xmlDom = server.createObject(“microsoft.xmldom”)
xmlDom.async=False
xmlDom.ValidateOnParse=false
xmlDom.load(xml.responseXML)
if xmlDom.ReadyState>2 Then
set oItem=xmlDom.getElementsByTagName(“item”)
for i=0 to oItem.length-1
response.write ”<span style=’font:bold 9px verdana;color:#000000′>”&i+1&”</span>. <a class=’title’ href=’”&oItem(i).childNodes(1).text&”‘ target=’_blank’>”&oItem(i).childNodes(0).text&”</a> <span class=’time’>["&oItem(i).childNodes(3).text&"]<br />”
response.write ”<div>摘要:”&oItem(i).childNodes(4).text&”</div><br>”
next
end if
%>
ASP.NET4.0的新功能 SEO 增强
ASP.NET4.0提供了一系列新的特性实现网站的 SEO优化,包括:
Page类的新属性:Page.MetaKeywords 和 Page.MetaDescription;
ASP.NET Web Forms 新的URL路由功能;
Response.RedirectPermanent()、Response.RedirectToRoutePermanent()方法等。
Page.MetaKeywords 和 Page.MetaDescription属性将生成 html 标记中的 和 ,例如
C# 代码
Page.MetaDescription = “ASP.NET 4.0学习站点:http://dotnet.aspx.cc/”;
Page.MetaKeywords = “孟宪会”;
将生成如下的代码:
HTML 代码
Response.RedirectPermanent()将进行HTTP 301(Moved Permanently)重定向。
基于.net平台的web框架搭建
最近基于ExtJs和asp.net mvc做了一个系统.来总结下.一起讨论下.
一.技术分析
1.web数据传输
ExtJS作为前端UI展现层,传输数据格式为json或者xml,一般大部分为json.
2.asp.net mvc
(不要考虑太多mvc其他特性,controller+method就够了)的和路由url很好的符合了这一要求,实现起来很轻松.
3.选一款依赖注入容器
只要你好好学过一款Ioc组件,概念都还是一样的,做法不同而已,我选的是微软的Unity,
这里我并没有把Service配置在xml中,根据我的理解,大部分软件并不需要这么灵活,我就纯注册就够了(其实往往是这样,我们可以问问自己,我们用到了多少功能).因为大部分都是注册一次,永不修改的…真的有必要的时候可以提出
Ioc组件很多,个人认为比较强大的还是spring.net,功能非常丰富,还有AOP功能,最主要的是其可以和其他组件结合的很好.
容器作为底层服务,主要就是为我们提供灵活性.想办法与现有组件结合,注册相关服务.
4.数据库操作(NHibernate)
3年前我会选ADO.NET
2年前我选Microsoft.Practices.Data.Application
1年前我选linq to sql
现在我选nhibernate
关于NHibernate映射
(1)若你是初学者,乖乖的自己手动配吧
(2)若你喜欢linq的,有一款FluentNHibernate可供选择(用新技术请考虑风险,玩的没关系)
(3)若你映射配置文件玩的很熟悉了,就用NHibernate.Mapping.Attributes挂标签自动生成吧(不推荐用什么代码生成器,都是要重新改的)
5.比较java web经典平台
比较庆幸,之前有接触过java,java的web编程架构很稳定,3年前如此,现在还是一样,不同的只是版本升级而已,这点.net程序员比较惨的.这也见证了spring,hibernate,struts(webwork)在目前而言是最好的拍档.
换成.net平台也就是spring.net(Ioc容器)+nhibernate(orm)+asp.net mvc
spring.net和nhibernate都属于java移植产品,所以应该来说资料是非常的多,想学习的人,应该把眼光放到java社区中,收获会很多的,稍微比较下c#和java语言就好了(千万别学了就跑去学java了:)).
asp.net mvc对比struts而言,方便了很多,但不同的是java附产品比较多,像asp.net mvc这样的框架,java也有些框架已经开始改进了(看到过,基本上理念是一样的).
当然这里均采用的开源路线,大家也可以采用微软自家平台的技术.
二.技术串联
1.注册容器
2.初始化Nhibernate
我们都知道Ioc是可以与asp.net mvc结合的
3.Nhibernate与容器配合法
(1)Nhibernate与spring.net的结合,这里已经有经典例子在了,何谓经典例子,就是大家都这么干,而且也没出什么问题,我也就这么干,确实有点道理的…虽然有时候真不懂为什么这么干。。。呵呵
(2)用单例的方式在应用启动时注册,如上法
(3)Nhibernate若映射换FluentNHibernate的话,或者加入linq to nh,则整个设计就要重新考虑了
我想上面的设计有点意思,特别是加入了linq to nh我的设想是这样的
(1)简单查询用linq to nh
(2)hql主打,标准查询辅助…
(3)若由于对nh框架不熟,导致查不出来,或者遇到速度慢,先上t-sql(原因一般都是自身学的不好造成的,先怀疑自己,怀疑不下去了再去怀疑框架本身…)
三.项目细分
这里忽略分布式应用,我没具体搞过…
Entity项目一个
Service接口项目一个
Service接口默认实现项目一个
Domain项目一个
主体辅助类项目一个(放杂七杂八用的)
测试项目一个(可选)
web相关项目一个(放与web相关的和controller)
web主打项目一个(运行项目,主放js用…)
基本上最基本的就是这样,你可以细分,也可以把上面很多项目合并为同一项目.
若想灵活就多用反射与配置文件
四.细化
若要完成一般的数据增删改系统的话,我们还可以稍微细化封装,这样的封装是很方便的.
1.没有绝对的灵活,需要一定的耦合,ext框架对于后端请求的json数据有一定要求,所以数据转换在所难免,所以准备一些通用的数据类型转换的功能
2.对于千篇一律的数据增删改,若无特殊的业务逻辑,可考虑借助asp.net mvc和反射功能完成,这样一个controller的设计可以代替很多个.
3.在传json时勿使用延迟加载等特性.
4.一个hql配置系统,不要因为某一查询条件改了而重新编写代码,可以考虑做个机制,把hql语句提取出来
5.巧用nhibernate拦截机制,日志必不可少
6.一套稳定的权限机制
7.对于ext,要有一套js加载机制
总结起来细化的都是对于不同需求而变化设计的.
如果不是很难的项目,花一段时间实践,这种搭配很容易学会.
接下来重点还是回到.net framework来学习.
2009年微软Silverlight十大流行应用
微软在2009年12月,发布Silverilght 4 Beta版本,其强大的功能,又一次吸引了众多RIA程序员的眼球,列出十个最流行的Silverlight应用项目如下:
1. Microsoft SDK for FacebookSNS应用是2009年的热门话题,为了推广Silverlight,微软很快推出了Silverlight FaceBook SDK。
2. Silverlight 3 和 Expression 3对于应用开发人员和界面设计人员来说,Silverlight Tools和Expression系列是最热门的应用。通过这两个应用,开发人员和设计人员可以快速开发出专业的Silverlight应用。
3. Silverlight 4 BetaSilverlight 4 的发布,让大家耳目一新,更多新的功能吸引了众多微软技术的追随者。
4. NASA应用Silverlight技术应用于NASA,NASA使用Silverlight技术播放太空空间站图片组。
5. Netflix 和 Windows Media CenterNetflix使用Silverlight多媒体技术提供在线电影DVD视频查看服务。
6. Wimbledon (温布尔顿网球公开赛)温布尔顿网球冠军赛使用Silverlight技术进行在线视频播放。
7. NBC使用Silverlight技术获得艾美奖NBC使用Silverlight技术提供HD高清2008奥运会转播视频,获得艾美奖。
8. NAB09的IIS Smooth Streaming洛杉矶NAB 2009使用IIS+Silverlight进行高清视频播放。
9. 迈克尔杰克逊纪念视频网迈克尔杰克逊的粉丝使用Silverlight技术,创建迈克尔杰克逊的音乐纪念网站。
10. Silverlight Bing和Bing Map控件微软提供Silverlight Bing Visual Search服务,另外发布了Bing Map控件。
ASP实现网页打开任何类型文件都保存
当页面上有一个链接指向服务器一个Word文件,当客户端机器有安装Office时,点击链接将调用Word打开浏览;当客户端机器没有安装Office时,点击链接将弹出保存对话框。总结一下即如果浏览器认识文件类型,就会自动打开;如果不认识,则会提示客户保存。可是有时候我们希望不管什么类型文件,都不要打开,直接让客户端保存。要达到这个要求,对于保存在服务器硬盘上的文件就得利用ASPUpload组件的SendBinary方法来实现,而对于保存在数据库中的文件则只须打开记录集,然后将二进制数据直接输出到客户端即可,不过要告诉浏览器文件的MIME类型、文件名称和文件大小。
1.服务器端硬盘上的文件
以下是引用片段:
<%
Dim Upload,FilePath
Set Upload = Server.CreateObject(“Persits.Upload”)
FilePath = Server.MapPath(“.”) & ”\” & ”2003529213019.txt”
‘SendBinary参数说明:
‘参数一:文件物理路径
‘参数二:是否将文件的MIME类型等信息传送给浏览器
‘参数三:文件类型,可以指定具体的MIME类型,但一般都可以使用application/octet-binary
‘参数四:让客户端保存文件还是直接打开。True:保存;False(默认):打开
Upload.SendBinary FilePath,True,”application/octet-binary”,True
%>
2.服务器端数据库中的文件
<%
Dim objConn,objRs
Set objConn = Server.CreateObject(“ADODB.Connection”)
Set objRs = Server.CreateObject(“ADODB.RecordSet”)
objConn.open ”Driver={Microsoft Access Driver (*.mdb)};dbq=” & Server.MapPath(“db1.mdb”)
objRs.open ”select * from t5 where id=2″,objConn,1,3
Response.ContentType = ”application/octet-stream”
Response.AddHeader ”Content-Disposition”,”attachment;filename=” & objRs(“filename”)
Response.AddHeader ”Content-Length”,CStr(objRs(“size”)) ’此处必须用CStr转换
Response.BinaryWrite objRs(“file”)
objRs.close
Set objRs = nothing
objConn.close
Set objConn = nothing
%>
此法要求保存文件时需同时保存文件名及文件大小!若未指定文件名及大小,如果浏览器认识该文件类型,将会自动打开;如果不认识,才会提示客户保存!
如何在ASP.Net 中把图片存入数据库
介绍
可能有很多的时候,我们急需把图片存入到数据库当中。在一些应用程序中,我们可能有一些敏感的资料,由于存储在文件系统(file system)中的东西,将很容易被某些用户盗取,所以这些数据不能存放在文件系统中。
在这篇文章中,我们将讨论怎样把图片存入到Sql2000当中。
在这篇文章中我们可以学到以下几个方面的知识:
1. 插入图片的必要条件
2. 使用流对象
3. 查找准备上传的图片的大小和类型
4.怎么使用InputStream方法?
插入图片的必要条件
在我们开始上传之前,有两件重要的事我们需要做:
#Form 标记的 enctype 属性应该设置成 enctype=”multipart/form-data”
# 需要一个<input type=file>表单来使用户选择他们要上传的文件,同时我们需要导入 System.IO名称空间来处理流对象
把以上三点应用到aspx页面。同时我们需要对SqlServer做以下的准备。
# 需要至少含有一个图片类型的字段的表
# 如果我们还有另外一个变字符类型的字段来存储图片类型,那样会更好一些。
现在,我们准备了一个Sql表(包含了一个image数据类型的字段),还有<input type=file>标记。当然我们还得准备Submit按钮,以便用户在选择了图片以后提交。在这个按钮的Onclick事件里,我们需要读取选取图片的内容,然后把它存入到表里。那我们先来看看这个Onclick事件。
提交按钮的Onclick事件的代码:
Dim intImageSize As Int64
Dim strImageType As String
Dim ImageStream As Stream
’ Gets the Size of the Image
intImageSize = PersonImage.PostedFile.ContentLength
’ Gets the Image Type
strImageType = PersonImage.PostedFile.ContentType
’ Reads the Image
ImageStream = PersonImage.PostedFile.InputStream
Dim ImageContent(intImageSize) As Byte
Dim intStatus As Integer
intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
’ Create Instance of Connection [...]
认识ASP.NET配置文件Web.config
一、认识Web.config文件
Web.config文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。当你通过VB.NET新建一个Web应用程序后,默认情况下会在根目录自动创建一个默认的
Web.config文件,包括默认的配置设置,所有的子目录都继承它的配置设置。如果你想修改子目录的配置设置,你可以在该子目录下新建一个Web.config文件。它可以提供除从父目录继承的配置信息以外的配置信息,也可以重写或修改父目录中定义的设置。
在运行时对Web.config文件的修改不需要重启服务就可以生效(注:<processModel> 节例外)。当然Web.config文件是可以扩展的。你可以自定义新配置参数并编写配置节处理程序以对它们进行处理。
二、web.config配置文件(默认的配置设置)以下所有的代码都应该位于
<configuration>
<system.web>
和
</system.web>
</configuration>
之间,出于学习的目的下面的示例都省略了这段XML标记
1、<authentication> 节
作用:配置 ASP.NET 身份验证支持(为Windows、Forms、PassPort、None四种)。该元素只能在计算机、站点或应用程序级别声明。<authentication> 元素必需与<authorization> 节配合使用。
示例:
以下示例为基于窗体(Forms)的身份验证配置站点,当没有登陆的用户访问需要身份验证的网页,网页自动跳转到登陆网页。
<authentication mode=”Forms” >
<forms loginUrl=”logon.aspx” name=”.FormsAuthCookie”/>
</authentication>
其中元素loginUrl表示登陆网页的名称,name表示Cookie名称
2、<authorization> 节
作用:控制对 URL 资源的客户端访问(如允许匿名用户访问)。此元素可以在任何级别(计算机、站点、应用程序、子目录或页)上声明。必需与<authentication> 节配合使用。
示例:以下示例禁止匿名用户的访问
<authorization>
<deny users=”?”/>
</authorization>
注:你可以使用user.identity.name来获取已经过验证的当前的用户名;可以使用
web.Security.FormsAuthentication.RedirectFromLoginPage方法将已验证的用户重定向到用户刚才请求的页面.具体的实例请参考:
Forms验证 http://www.fanvb.net/websample/dataauth.aspx
3、<compilation>节
作用:配置 ASP.NET 使用的所有编译设置。默认的debug属性为“True”.在程序编译完成交付使用之后应将其设为True(Web.config文件中有详细说明,此处省略示例)
4、<customErrors>
作用:为 ASP.NET 应用程序提供有关自定义错误信息的信息。它不适用于 XML Web services 中发生的错误。
示例:当发生错误时,将网页跳转到自定义的错误页面。
<customErrors defaultRedirect=”ErrorPage.aspx” mode=”RemoteOnly”>
</customErrors>
其中元素defaultRedirect表示自定义的错误网页的名称。mode元素表示:对不在本地 Web 服务器上运行的用户显示自定义(友好的)信息。
5、<httpRuntime>节
作用:配置 ASP.NET HTTP 运行库设置。该节可以在计算机、站点、应用程序和子目录级别声明。
示例:控制用户上传文件最大为4M,最长时间为60秒,最多请求数为100
<httpRuntime maxRequestLength=”4096″ executionTimeout=”60″ appRequestQueueLimit=”100″/>
6、 <pages>
作用:标识特定于页的配置设置(如是否启用会话状态、视图状态,是否检测用户的输入等)。<pages>可以在计算机、站点、应用程序和子目录级别声明。
示例:不检测用户在浏览器输入的内容中是否存在潜在的危险数据(注:该项默认是检测,如果你使用了不检测,一要对用户的输入进行编码或验证),在从客户端回发页时将检查加密的视图状态,以验证视图状态是否已在客户端被篡改。(注:该项默认是不验证)
<pages buffer=”true” enableViewStateMac=”true” validateRequest=”false”/>
7、<sessionState>
作用:为当前应用程序配置会话状态设置(如设置是否启用会话状态,会话状态保存位置)。
示例:
<sessionState mode=”InProc” cookieless=”true” timeout=”20″/>
</sessionState>
注:
mode=”InProc”表示:在本地储存会话状态(你也可以选择储存在远程服务器或SAL服务器中或不启用会话状态)
cookieless=”true”表示:如果用户浏览器不支持Cookie时启用会话状态(默认为False)
timeout=”20″表示:会话可以处于空闲状态的分钟数
8、<trace>
作用:配置 ASP.NET 跟踪服务,主要用来程序测试判断哪里出错。
示例:以下为Web.config中的默认配置:
<trace enabled=”false” requestLimit=”10″ pageOutput=”false” traceMode=”SortByTime” localOnly=”true” />
注:
enabled=”false”表示不启用跟踪;requestLimit=”10″表示指定在服务器上存储的跟踪请求的数目
pageOutput=”false”表示只能通过跟踪实用工具访问跟踪输出;
traceMode=”SortByTime”表示以处理跟踪的顺序来显示跟踪信息
localOnly=”true” [...]
Asp.net中防止用户多次登录的方法
在web开发时,有的系统要求同一个用户在同一时间只能登录一次,也就是如果一个用户已经登录了,在退出之前如果再次登录的话需要报错。
常见的处理方法是,在用户登录时,判断此用户是否已经在Application中存在,如果存在就报错,不存在的话就加到Application中(Application是所有Session共有的,整个web应用程序唯一的一个对象):
string strUserId = txtUser.Text;
ArrayList list = Application.Get(“GLOBAL_USER_LIST”) as ArrayList;
if (list == null)
{
list = new ArrayList();
}
for (int i = 0; i < list.Count; i++)
{
if (strUserId == (list[i] as string))
{
//已经登录了,提示错误信息
lblError.Text = ”此用户已经登录”;
return;
}
}
list.Add(strUserId);
Application.Add(“GLOBAL_USER_LIST”, list);
当然这里使用Cache等保存也可以。
接下来就是要在用户退出的时候将此用户从Application中去除,我们可以在Global.asax的Session_End事件中处理:
void Session_End(object sender, EventArgs e)
{
// 在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer,则不会引发该事件。
string strUserId = Session["SESSION_USER"] as string;
ArrayList list = Application.Get(“GLOBAL_USER_LIST”) as ArrayList;
if (strUserId != null && list != null)
{
list.Remove(strUserId);
Application.Add(“GLOBAL_USER_LIST”, list);
}
}
这些都没有问题,有问题的就是当用户直接点浏览器右上角的关闭按钮时就有问题了。因为直接关闭的话,并不会立即触发Session过期事件,也就是关闭浏览器后再来登录就登不进去了。
这里有两种处理方式:
1、使用Javascript方式
在每一个页面中加入一段javascript代码:
function window.onbeforeunload()
{
if (event.clientX>document.body.clientWidth && event.clientY<0||event.altKey){
window.open(“logout.aspx”);
}
}
由于onbeforeunload方法在浏览器关闭、刷新、页面调转等情况下都会被执行,所以需要判断是点击了关闭按钮或是按下Alt+F4时才执行真正的关闭操作。
然后在logout.aspx的Page_Load中写和Session_End相同的方法,同时在logout.aspx中加入事件:onload=”javascript:window.close()”
但是这样还是有问题,javascript在不同的浏览器中可能有不同的行为,还有就是当通过文件->关闭时没有判断到。
2、使用xmlhttp方法(这种方法测试下来没有问题)
在每个页面中加入如下的javascript(这些javascript也可以写在共通里,每个页面引入就可以了)
var x=0;
function myRefresh()
{
var httpRequest = new ActiveXObject(“microsoft.xmlhttp”);
httpRequest.open(“GET”, ”test.aspx”, false);
httpRequest.send(null);
x++;
if(x<60) //60次,也就是Session真正的过期时间是30分钟
{
setTimeout(“myRefresh()”,30*1000); //30秒
}
}
myRefresh();
在web.config中设置
<sessionState mode=”InProc” timeout=”1″></sessionState>
test.aspx页面就是一个空页面,只不过需要在Page_Load中加入:
Response.Expires = -1;
保证不使用缓存,每次都能调用到这个页面。
原理就是:设置Session的过期时间是一分钟,然后在每个页面上定时每30秒连接一次测试页面,保持Session有效,总共连60次,也就是30分钟。如果30分钟后用户还没有操作,Session就会过期。当然,如果用户直接关闭浏览器,那么一分钟后Session也会过期。这样就可以满足要求了。
在Asp.net MVC中使用Repeater
1. Repeater需要手动去绑定数据。 意思是说我们要在View当中写 服务端代码,先从ViewData中取得数据,再去绑定到Repeater。
2. 如果一个页面用到n+1个Repeater,那会不会疯掉? 而且要给每一个Repeater指定 Id,必去绑数据,头痛啊!!!
那么~~ 可不可以让Repeater用起来简单点呢? 来对Repeater进行一下改造,达到目的。
在Mvc当中,使用 ViewData 来传递数据,那可不可以直接让Repeater 绑定 ViewData 中的数据呢? 当然可以
看改造后的 Repeater 源码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.Mvc;
namespace RepeaterInMvc.Codes
{
public class MvcRepeater : Repeater
{
/// <summary>
/// ViewData中的键名
/// </summary>
public string Key { get; set; }
/// <summary>
/// 得到ViewPage对象
/// </summary>
protected ViewPage ViewPage
{
get { return base.Page as ViewPage; }
}
/// <summary>
/// 重写Onload事件 用于绑定数据
/// </summary>
/// <param name=”e”></param>
protected override void OnLoad(EventArgs e)
{
this.DataSource = this.ViewPage.ViewData[this.Key]; //得到数据源
this.DataBind(); //绑定 这样就不用手动写N个绑定了
base.OnLoad(e);
}
}
}
上面的代码做了什么:
1. 添加了一个公共属性 Key ,表示这个Repeater要绑定 ViewData 中哪一项数据。
2. 添加了一个保护属性 ViewPage ,指向了当前的 Page 对象 并强制转换成 Mvc 的 ViewPage对象 (因为我们要得到ViewData或其它Mvc相关的上下文信息)
3. 重写了 OnLoad 事件,重写这个事件,用来绑定数据,免得我们需要在View中手动绑定每一个Repeater,那多烦啊。
现在我们的目的已经达到了。看看怎么使用吧:
控制器代码:
public ActionResult Index()
{
//来点测试数据
List<Models.TestInfo> entities = new List<RepeaterInMvc.Models.TestInfo>();
entities.Add(new RepeaterInMvc.Models.TestInfo { Id = 1, Name = ”Kagilo1″, Email = ”1@1.com” });
entities.Add(new RepeaterInMvc.Models.TestInfo { Id = 2, Name = ”Kagilo2″, Email = ”1@1.com” });
entities.Add(new RepeaterInMvc.Models.TestInfo { Id = 3, Name = ”Kagilo3″, Email = ”1@1.com” });
entities.Add(new RepeaterInMvc.Models.TestInfo { Id = 4, Name = ”Kagilo4″, Email = ”1@1.com” });
entities.Add(new RepeaterInMvc.Models.TestInfo { Id = 5, Name = ”Kagilo5″, Email = ”1@1.com” });
ViewData["TestList"] = entities;
return View();
}
再看看页面代码:
<%@ Register Assembly=”RepeaterInMvc” Namespace=”RepeaterInMvc.Codes” TagPrefix=”mvc” %>
<asp:Content ID=”indexTitle” ContentPlaceHolderID=”TitleContent” runat=”server”>
Home Page
</asp:Content>
<asp:Content ID=”indexContent” ContentPlaceHolderID=”MainContent” runat=”server”>
<h2>Repeater示例</h2>
<p>
<mvc:MvcRepeater Key=”TestList” runat=”server”>
<ItemTemplate>
<div style=”height:30px; line-height:30px;”><%# Eval(“Id”) %>, <%# Eval(“Name”) %>, <%# Eval(“Email”) %></div>
</ItemTemplate>
<AlternatingItemTemplate>
<div style=”height:30px; line-height:30px; background:#eeeeee;”><%# Eval(“Id”) %>, <%# Eval(“Name”) %>, <%# Eval(“Email”) %></div>
</AlternatingItemTemplate>
</mvc:MvcRepeater>
</p>
</asp:Content>
TPS :<%@ Register Assembly=”RepeaterInMvc” Namespace=”RepeaterInMvc.Codes” TagPrefix=”mvc” %>
在当前页面注册控件!!! 当然,你也可以在 web.config 中的 page/controls 节点中为所有页面注册。