ASPNET2.0(C#)基础教程11
ASP.NET 2.0入门经典2

2.0入门经典(第4版)2.1 总体设计目标在开始开发Web站点之前,通常应该设想好站点所具有的功能;例如,一个博客(blog)站点,必须能够对帖子进行分类存储、向帖子添加评论,还需有进行管理的模块,这些是最少的功能。
另外,考虑一个简单的零售商店,它想进入电子商务领域,它希望通过Web站点让客户浏览并购买商品。
在着手开发任何一个站点之前,都必须仔细地考虑和设计,之后才能编写代码实现站点。
在开始讨论具体技术的实现时,我们应先讨论如何使用 2.0服务器端控件所支持的功能开发设计良好的站点。
毕竟,创建、使用和维护经过良好设计的站点要容易得多,而且维护费用更低。
本章将介绍以下概念:●怎样启动站点的设计流程,并在开始编写代码之前考虑站点的所有需求。
●使用Master和Content页面实现站点的一致外观,这是 2.0最重要的新功能。
●创建站点地图,该地图表明站点中存在哪些页面,以及这些页面在层次上与其他文件是什么关系。
●使用Web.config和Global.asax文件保存数据和代码的全局配置,这些配置将用于站点的所有页面。
在本章的结束部分有一些练习可以帮助加深对这些概念的理解。
1.1 总体设计目标设计一个功能完整的Web应用程序是一项很复杂的任务。
如果是开发自己的站点,可能对站点是什么样子考虑得已经很多很具体了,所以在开始编写代码之前知道自己要做什么。
然而,如果是为客户开发站点,就必须确保在站点的设计上与客户在各个细节上达成高度的一致。
在一个专业的开发环境中,这个过程通常包括如下步骤:●开发一个功能模型,该模型描述站点的具体运行情况。
当用户单击Log In按钮时会发生什么事情?当用户想浏览产品时哪些功能是可用的?在开始设计之前,需要回答这些问题以及其他很多问题,以免最后开发出来的站点不是客户想要的!●确定在实现站点的过程中可以使用的技术。
很多主机软件包对数据库的支持都有不同程度的限制,进而限制站点的总体大小,所以要尽早讨论这个问题并确保能使用所希望使用的技术。
管家婆V3新版配置操作步骤

V3配置步骤首先请确认正确安装了IIS, 2.01、找到net Framework框架下aspnet_isapi.dll的路径(如Win2003默认安装路径为C:\windows\\Framework\v2.0.50727\aspnet_isapi.dll)2、添加ajax扩展:在虚拟目录,属性→主目录→配置→应用程序映射选项卡中点添加,在可执行文件中录入aspnet_isapi.dll路径,在扩展名中录入“.ajax”。
如图T001显示(图T001)出在IIS配置上,JXC-属性-虚拟目录-应用程序配置-映射-编辑-里面我们自己新增的2个,把确认文件是否存在去掉打钩3、添加gspx扩展:在虚拟目录,属性→主目录→配置→应用程序映射选项卡中点添加,在可执行文件中录入aspnet_isapi.dll路径,在扩展名中录入“.gspx”。
4、添加Default.gspx:在虚拟目录,属性→文档选项卡中点添加,在默认文档名中录入“Default.gspx”如图T002显示(图T002)备注:正确安装.net框架后无法进入系统(图T003),是系统盘下temp目录的权限造成的,就要进入系统盘,找到windows/temp,和WINDOWS\\Framework\v2.0.50727右键点击temp,和v2.0.50727选择属性。
点开“安全”选项卡,增加一个Everyone的操作员(图T004),并且该操作员具有全部权限(图T005)保存后重新登录即可。
(图T003)(图T004)(图T005)V3 二代产品特殊配置第一步:默认网站--属性-----http头,第二步:点击mime类型,第三步:点击新建:输入扩展名以及类型:扩展名:.xapMIME 类型:application/x-silverlight-app最后重启iis后再访问即可。
NET 4.0安装常见问题

IIS中的版本号此时可选的有1.1、2.0和4.0三个,如果想让IIS把3个版本都集成上,那NET Framework 3种都要安装,默认安装到的是C盘。
IIS注册方式如下:1.1:C:\WINDOWS\\Framework\v1.1.4322\aspnet_regiis.exe -i2.0:C:\WINDOWS\\Framework\v2.0.50727\aspnet_regiis.exe -i4.0:C:\WINDOWS\\Framework\v4.0.30319\aspnet_regiis.exe -i常见问题:安装好.NET 4后还是找不到设定网站站台的页签的 4.0 的选项这问题通常出在先安装Microsoft .NET Framework 4 才安装IIS6,这时必须输入以下指令将 4.0 注册进IIS6 即可:C:\WINDOWS\\Framework\v4.0.30319\aspnet_regiis.exe -ir -enable常见问题:安装好.NET 4也设定好网站站台的 4.0 的选项依然无法执行网站这里的「无法执行网站」其实所有执行的页面都会出现找不到这个页面(HTTP 错误404 - 找不到档案或目录) 的响应,不管你怎么设定目录安全性或任何执行权限都无法执行任何 程序,而且可能只有静态页面可以读取而已。
如果你因为安装 MVC 而有设定「万用字符应用程序对应」的话,则会发现网站所有页面包括静态档案读去都会响应找不到这个页面的错误!此问题发生的原因是IIS6 阻挡了c:\windows\\framework\v4.0.30319\aspnet_isapi.dll 程序的执行,由于所有会被导向到此ISAPI Handler 的要求全部都会失败,所以才会导致你所有HTTP 要求都会得到HTTP 404 Not Found 的结果。
解决方式很简单,只要到[网页服务延伸] 的地方将 v4.0.30319 设定[允许]即可常见问题: 4.0 的网站站台已经设定好也可以正常执行了,但执行一段时间会自己挂掉!如果你在同一个应用程序集区设定了两个不同版本的 就会造成这个问题,例如你原本有个 2.0 的站台,并且设定的应用程序集区为DefaultAppPool,然而你之后又新增了一个 4.0 的站台,而预设的应用程序集区也是在DefaultAppPool 的话就会发生冲突了,这时就会看是哪个站台先被执行起来,先跑起来的那个站台才会抢到所有权,后面执行的那个就会发生Server Application Unavailable 或服务器应用程序无法使用的错误:解决的方法有二:∙将共享应用程序集区的网站站台或网站应用程序(虚拟目录)都设定到 v4.0.30319∙区分两个不同的应用程序集区。
如何解决 Microsoft .NET Framework 2.0 安装问题

如何解决Microsoft .NET Framework 2.0 安装问题查看本文应用于的产品重要说明:本文包含有关如何修改注册表的信息。
修改注册表之前,一定要先进行备份,并且一定要知道在发生问题时如何还原注册表。
有关如何备份、还原和修改注册表的更多信息,请单击下面的文章编号,以查看Microsoft 知识库中相应的文章:256986 (/kb/256986/ ) Microsoft Windows 注册表说明简介要求注销然后重新注册Windows Installer修复.NET Framework 2.0在Windows Installer 缓存文件中使用Repair 命令在命令提示符下运行.NET Framework 2.0 可再发行组件包手动删除然后重新安装.NET Framework 2.0参考概要您可以使用本文中的方法解决Microsoft .NET Framework 2.0 版中出现的安装问题。
本文讨论了Microsoft Windows Ser...您可以使用本文中的方法解决Microsoft .NET Framework 2.0 版中出现的安装问题。
本文讨论了Microsoft Windows Server 2003、Windows 2000 Service Pack 3 (SP3) 或Windows XP Service Pack 2 (SP2) 上的安装。
本文介绍的方法包括重新注册Microsoft Windows Installer,以及修复、删除和重新安装.NET Framework。
要使用这些方法,您应当熟悉.NET Framework 2.0、注册表编辑器和Windows Installer。
此外,上述方法中有一种方法需要您更改计算机上的注册表。
简介本文逐步介绍如何解决当安装.NET Framework 2.0 时可能遇到的问题。
如果Windows 注册表中的Microsoft Windows In...本文逐步介绍如何解决当安装.NET Framework 2.0 时可能遇到的问题。
ASP.NET 2.0网站开发全程解析

作者简介Marco BellinasO是意大利CodeArchitects SrL公司的合伙人之一,这家公司专门为微软平台提供咨询、指导、开发和培训。
作为一名资深的顾问和开发人员,MarcO对所有的Web开发技术都特别感兴趣。
他着重于用微软的产品和技术开发大型Web网站,包括SharePoint 2003、MCMS,当然还有ASRNET 2.0和SQL Server 2005。
从.NET Framework的Beta 1版开始,他就已经在Web Services、Windows Forms和Windows Services等方面进行了许多应用。
他同时还是一系列商业开发工具的开发者或合作者,如获奖的VBMaximizer插件、用于.NET的CodeBox和FormMaximizer。
在.NET发布之前,Marco是一个VB开发者,与COM和ASP开发者一样,他也善于应用高级的底层APl技术来开发Windows程序。
在撰写本书之前,MarcO参与编写了由Wrox出版的其他一些图书,包括FastTrackASPNET,VisualC#.NET:A Guide fOR.VB6 Developers,Beginning C#和基于ASRNET 1.1的本书的上Computer Programmin9和Visual Basic&.NETJournal等杂志撰写文章。
他是网站的主要开发者和编辑人员之一,这个受欢迎的Web网站服务于.NET开发者,它是从另一个更著名的关于VB6的Web网站衍生而来的。
写作之余,MarcO还在由意大利微软和其他大公司主办的许多重要会议上用英语和意大利语发表演讲。
如果您有意与MarcO讨论本书的相关问题,请登录或他的博客/blogs/mbellinasO与他联系。
编辑推荐本书介绍了用C#开发 2.0网站的完整过程,示例网站TheBeerHouse经过了重新编写,并将内容全面升级为 2.0版,包含了很多当今主流内容网站及电子商务网站所拥有的功能,如论坛、民意调查、文章管理和电子商务等。
30本关于asp.net相关的经典书籍推荐

30本关于相关的经典书籍推荐⼀.⼊门1.《HTML与CSS⼊门经典(第7版) 》HTML⼊门点评:html语⾔的⼊门,由于html极其简单所以同类其他书也可代替,本书并⾮经典,本书摆在这⾥纯属占位!你可以⽤其他书代替。
2.《C#⼊门经典(第3版)》C#⼊门点评:经典中的经典,个⼈认为是30本书⾥最重要的,虽然其他讲C#的好书也很多但⼤多1.0版的,很多在书店已经绝版,被《程序员》等机构评选为2006年最受读者喜爱的⼗⼤IT图书之⼀。
3.《精通SQL--结构化查询语⾔详解》SQL数据⼊门点评:不能说很好,但也不差,感觉吃透全书也可以应付如常SQL语句了。
4.《专家门诊--SQL SERVER开发答疑200问》SQL数据⼊门点评:好书,正好结合上本,可惜的是不是Sqlserver2005。
6.《Programming 中⽂版(第3版)》基础点评:经典中的经典,全球经典,五年三版,权威著作,这本书是最最基础的⼊门书,讲的⾮常全涵盖所有基本⾯,每⼀个控件都细细说明,⾮常易懂,不过本书讲的难免有点杂,初学者看了难免云⾥雾⾥所以要下⼀本书提纲挈领,此书⾮看不可。
7.《 2.0经典教程--C#篇》基础点评:经典,和上⼀本结合起来最好,本书讲⼤的⽅⾯,看了能让⼈明⽩分那⼏个步骤,不过唯⼀的缺陷就是不细,上⼀本正好补充,此书⾮看不可。
9.《JAVASCRIPT 权威指南(第四版)》Javascript基础点评:好书却不经典,这本书也被吹嘘的神乎其神,其实后半部分全部是Javascript语法参考,感觉本书只能做参考书,讲语法还是可以的讲的还算深,内容也很详,不过看懂前半部分后来喜欢它的原因却变后半部分,和下⼀本结合就成更完美的参考书。
10.《WEB开发⼈员参考⼤全:最完整的HTML、CSS与JAVASCRIPT⼯具书》Javascript,html,css基础点评:好书,书如其名,作者是位⽼先⽣,经验很丰富,本书是每⼀位从事BS开发⼈员的必备参考书和上⼀本结合就更好了。
第一讲ASP.NET概述
优点
与浏览器无关 将业务逻辑代码与显示逻辑分开 新的集成开发环境 简单性和易学性 用户帐户和角色 多处理器环境的可靠性 可扩展性 高效的可管理性 执行效率的大幅提高 易于配置和部署
Web 应用程序文件结构
C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高 需求, 与操作系统相关. 应该都是相同的系统 ,B/S 建立在广域网 上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系 统平台关系最小. 7.用户接口不同
C/S 多是建立的Window平台上,表现方法有限,对程序员普遍 要求较高,B/S 建立在浏览器上, 有更加丰富和生动的表现方式与 用户交流. 并且大部分难度减低,减低开发成本. 8.信息流不同
将程序集引入到当前页面或用户控件中,以便它所包含 的类和接口能够适用于页面中的代码
的功能
技术利用面向对象的语言如C#进行后台开发,它包括一系列很 有用的类和命名空间
类 - HtmlControl
相似的功能
命名空间
类 - HtmlAnchor
类 - HtmlForm
在逻辑上将具有相似功能的类进行分组
的功能
服务器控件是在服务器上运行并封装用户界面及 其他相关功能的组件,这些控件提供了各种属性、方法和 事件,可简化构建强大的 Web 应用程序的过程
代码编译执行
_______ _______ _______ ______
代码
编译
Microsoft 中间语言
(MSIL 或 IL)
机器语言
JIT 编译器
分别编译 IL 的每一部分
的功能
ASP.NET2.0 遍历文件夹下所有图片
using System.Web.UI.HtmlControls;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Lifetime;
using System.IO;
<head runat="server">
<title>遍历文件夹下所有图片 /21aspnet 清清月儿</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DataList ID="DataList1" runat="server" RepeatColumns="3">
context.Response.ContentType = "image/jpeg";
context.Response.BufferOutput = false;
bmap.Save(context.Response.OutputStream, ImageFormat.Jpeg);
}
public bool IsReusable
{
get
{
return false;
}
}
�
using System.Web.Caching;
ASP.NET实现QQ、微信、新浪微博OAuth2.0授权登录
不管是腾讯还是新浪,查看他们的API,PHP都是有完整的接口,但对C#支持似乎都不是那么完善,都没有,腾讯是完全没有,新浪是提供第三方的,而且后期还不一定升级,NND,用第三方的动辄就一个类库,各种配置还必须按照他们约定的写,烦而且乱,索性自己写,后期的扩展也容易,看过接口后,开始以为很难,参考了几个源码之后发现也不是那么难,无非是GET或POST请求他们的接口获取返回值之类的,话不多说,这里只提供几个代码共参考,抛砖引玉了。
我这个写法的特点是,用到了Session,使用对象实例化之后调用Login() 跳转到登录页面,在回调页面调用Callback() 执行之后,可以从Session也可以写独立的函数(如:GetOpenID())中获取access_token或用户的唯一标识,以方便做下一步的操作。
所谓绑定就是把用户的唯一标识取出,插入数据库,和帐号绑定起来。
1.首先是所有OAuth类的基类,放一些需要公用的方法public abstract class BaseOAuth{ public HttpRequest Request = HttpContext.Current.Request; public HttpResponse Response = HttpContext.Current.Response; public HttpSessionState Session = HttpContext.Current.Session; public abstract void Login(); public abstract string Callback(); #region 内部使用函数 /// <summary> /// 生成唯一随机串防CSRF攻击 /// </summary> /// <returns></returns> protected string GetStateCode() { Random rand = new Random(); string data = DateTime.Now.ToString("yyyyMMddHHmmssffff") + rand.Next(1, 0xf423f).ToString(); MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] md5byte = puteHash(UTF8Encoding.Default.GetBytes(data)); return BitConverter.ToString(md5byte).Replace("-", ""); } /// <summary> /// GET请求 /// </summary> /// <param name="url"></param> /// <returns></returns> protected string GetRequest(string url) { HttpWebRequest httpWebRequest = .WebRequest.Create(url) asHttpWebRequest; httpWebRequest.Method = "GET"; httpWebRequest.ServicePoint.Expect100Continue = false; StreamReader responseReader = null; string responseData; try { responseReader = new StreamReader(httpWebRequest.GetResponse().GetResponseStream()); responseData = responseReader.ReadToEnd(); } finally { httpWebRequest.GetResponse().GetResponseStream().Close(); responseReader.Close(); } return responseData; } /// <summary> /// POST请求 /// </summary> /// <param name="url"></param> /// <param name="postData"></param> /// <returns></returns> protected string PostRequest(string url, string postData) { HttpWebRequest httpWebRequest = .WebRequest.Create(url) as HttpWebRequest; httpWebRequest.Method = "POST"; httpWebRequest.ServicePoint.Expect100Continue = false; httpWebRequest.ContentType = "application/x-www-form-urlencoded"; //写入POST参数 StreamWriter requestWriter = new StreamWriter(httpWebRequest.GetRequestStream()); try { requestWriter.Write(postData); } finally { requestWriter.Close(); } //读取请求后的结果 StreamReader responseReader = null; string responseData; try { responseReader = new StreamReader(httpWebRequest.GetResponse().GetResponseStream()); responseData = responseReader.ReadToEnd(); } finally { httpWebRequest.GetResponse().GetResponseStream().Close(); responseReader.Close(); } return responseData; } /// <summary> /// 解析JSON /// </summary> /// <param name="strJson"></param> /// <returns></returns> protected NameValueCollection ParseJson(string strJson) { NameValueCollection mc = new NameValueCollection(); Regex regex = new Regex(@"(\s*\bsp; } foreach (Match m in regex.Matches(strJson)) { mc.Add(m.Groups[2].V alue, m.Groups[3].Value); } return mc; } /// <summary> /// 解析URL /// </summary> /// <param name="strParams"></param> /// <returns></returns> protected NameValueCollection ParseUrlParameters(string strParams) { NameValueCollection nc = new NameValueCollection(); foreach (string p in strParams.Split('&')) { string[] ps = p.Split('='); nc.Add(ps[0], ps[1]); } return nc; } #endregion}2.QQ的OAuth类public class QQOAuth : BaseOAuth{ public string AppId = ConfigurationManager.AppSettings["OAuth_QQ_AppId"]; public string AppKey = ConfigurationManager.AppSettings["OAuth_QQ_AppKey"]; public string RedirectUrl = ConfigurationManager.AppSettings["OAuth_QQ_RedirectUrl"]; public const string GET_AUTH_CODE_URL = "https:///oauth2.0/authorize"; public const string GET_ACCESS_TOKEN_URL = "https:///oauth2.0/token"; public const string GET_OPENID_URL = "https:///oauth2.0/me"; /// <summary> /// QQ登录,跳转到登录页面 /// </summary> public override void Login() { //-------生成唯一随机串防CSRF攻击 string state = GetStateCode(); Session["QC_State"] = state; //state 放入Session string parms = "?response_type=code&" + "client_id=" + AppId + "&redirect_uri=" + Uri.EscapeDataString(RedirectUrl) + "&state=" + state; string url = GET_AUTH_CODE_URL + parms; Response.Redirect(url); //跳转到登录页面 } /// <summary> /// QQ回调函数 /// </summary> /// <param name="code"></param> /// <param name="state"></param> /// <returns></returns> public override string Callback() { string code = Request.QueryString["code"]; string state = Request.QueryString["state"]; //--------验证state防止CSRF攻击 if (state != (string)Session["QC_State"]) { ShowError("30001"); } string parms = "?grant_type=authorization_code&" + "client_id=" + AppId + "&redirect_uri=" + Uri.EscapeDataString(RedirectUrl) + "&client_secret=" + AppKey + "&code=" + code; string url = GET_ACCESS_TOKEN_URL + parms; string str = GetRequest(url); if (str.IndexOf("callback") != -1) { int lpos = str.IndexOf("("); int rpos = str.IndexOf(")"); str = str.Substring(lpos + 1, rpos - lpos - 1); NameValueCollection msg = ParseJson(str); if (!string.IsNullOrEmpty(msg["error"])) { ShowError(msg["error"], msg["error_description"]); } } NameValueCollection token = ParseUrlParameters(str); Session["QC_AccessToken"] = token["access_token"]; //access_token 放入Session return token["access_token"]; } /// <summary> /// 使用Access Token来获取用户的OpenID /// </summary> /// <param name="accessToken"></param> /// <returns></returns> public string GetOpenID() { string parms = "?access_token=" + Session["QC_AccessToken"]; string url = GET_OPENID_URL + parms; string str = GetRequest(url); if (str.IndexOf("callback") != -1) { int lpos = str.IndexOf("("); int rpos = str.IndexOf(")"); str = str.Substring(lpos + 1, rpos - lpos - 1); } NameValueCollection user = ParseJson(str); if (!string.IsNullOrEmpty(user["error"])) { ShowError(user["error"], user["error_description"]); } Session["QC_OpenId"] = user["openid"]; //openid 放入Session return user["openid"]; } /// <summary> /// 显示错误信息 /// </summary> /// <param name="code">错误编号</param> /// <param name="description">错误描述</param> private void ShowError(string code, string description = null) { if (description == null) { switch (code) { case "20001": description = "<h2>配置文件损坏或无法读取,请检查web.config</h2>"; break; case "30001": description = "<h2>The state does not match. You may be a victim of CSRF.</h2>"; break; case "50001": description = "<h2>可能是服务器无法请求https协议</h2>可能未开启curl支持,请尝试开启curl支持,重启web服务器,如果问题仍未解决,请联系我们"; break; default: description = "<h2>系统未知错误,请联系我们</h2>"; break; } Response.Write(description); Response.End(); } else { Response.Write("<h3>error:<h3>" + code + "<h3>msg:<h3>" + description); Response.End(); } }}3.新浪微博的OAuth类public class SinaOAuth : BaseOAuth{ public string AppKey = ConfigurationManager.AppSettings["OAuth_Sina_AppKey"]; public string AppSecret = ConfigurationManager.AppSettings["OAuth_Sina_AppSecret"]; public string RedirectUrl = ConfigurationManager.AppSettings["OAuth_Sina_RedirectUrl"]; public const string GET_AUTH_CODE_URL = "https:///oauth2/authorize"; public const string GET_ACCESS_TOKEN_URL = "https:///oauth2/access_token"; public const string GET_UID_URL = "https:///2/account/get_uid.json"; /// <summary> /// 新浪微博登录,跳转到登录页面 /// </summary> public override void Login() { //-------生成唯一随机串防CSRF攻击 string state = GetStateCode(); Session["Sina_State"] = state; //state 放入Session string parms = "?client_id=" + AppKey + "&redirect_uri=" + Uri.EscapeDataString(RedirectUrl) + "&state=" + state; string url = GET_AUTH_CODE_URL + parms; Response.Redirect(url); //跳转到登录页面 } /// <summary> /// 新浪微博回调函数 /// </summary> /// <returns></returns> public override string Callback() { string code = Request.QueryString["code"]; string state = Request.QueryString["state"]; //--------验证state防止CSRF攻击 if (state != (string)Session["Sina_State"]) { ShowError("The state does not match. You may be a victim of CSRF."); } string parms = "client_id=" + AppKey + "&client_secret=" + AppSecret + "&grant_type=authorization_code&code=" + code + "&redirect_uri=" + Uri.EscapeDataString(RedirectUrl); string str = PostRequest(GET_ACCESS_TOKEN_URL, parms); NameValueCollection user = ParseJson(str); Session["Sina_AccessToken"] = user["access_token"]; //access_token 放入Session Session["Sina_UId"] = user["uid"]; //uid 放入Session return user["access_token"]; } /// <summary> /// 显示错误信息 /// </summary> /// <param name="description">错误描述</param> private void ShowError(string description = null) { Response.Write("<h2>" + description + "</h2>"); Response.End(); }}4.微信的OAuth类public class WeixinOAuth : BaseOAuth{ public string AppId = ConfigurationManager.AppSettings["OAuth_Weixin_AppId"]; public string AppSecret = ConfigurationManager.AppSettings["OAuth_Weixin_AppSecret"]; public string RedirectUrl = ConfigurationManager.AppSettings["OAuth_Weixin_RedirectUrl"]; public const string GET_AUTH_CODE_URL = "https:///connect/qrconnect"; public const string GET_ACCESS_TOKEN_URL = "https:///sns/oauth2/access_token"; public const string GET_USERINFO_URL = "https:///sns/userinfo"; /// <summary> /// 微信登录,跳转到登录页面 /// </summary> public override void Login() { //-------生成唯一随机串防CSRF攻击 string state = GetStateCode(); Session["Weixin_State"] = state; //state 放入Session string parms = "?appid=" + AppId + "&redirect_uri=" + Uri.EscapeDataString(RedirectUrl) + "&response_type=code&scope=snsapi_login" + "&state=" + state + "#wechat_redirect"; string url = GET_AUTH_CODE_URL + parms; Response.Redirect(url); //跳转到登录页面 } /// <summary> /// 微信回调函数 /// </summary> /// <param name="code"></param> /// <param name="state"></param> /// <returns></returns> public override string Callback() { string code = Request.QueryString["code"]; string state = Request.QueryString["state"]; //--------验证state防止CSRF攻击 if (state != (string)Session["Weixin_State"]) { ShowError("30001"); } string parms = "?appid=" + AppId + "&secret=" + AppSecret + "&code=" + code + "&grant_type=authorization_code"; string url = GET_ACCESS_TOKEN_URL + parms; string str = GetRequest(url); NameValueCollection msg = ParseJson(str); if (!string.IsNullOrEmpty(msg["errcode"])) { ShowError(msg["errcode"], msg["errmsg"]); } Session["Weixin_AccessToken"] = msg["access_token"]; //access_token 放入Session Session["Weixin_OpenId"] = msg["openid"]; //access_token 放入Session return msg["access_token"]; } /// <summary> /// 显示错误信息 /// </summary> /// <param name="code">错误编号</param> /// <param name="description">错误描述</param> private void ShowError(string code, string description = null) { if (description == null) { switch (code) { case "20001": description = "<h2>配置文件损坏或无法读取,请检查web.config</h2>"; break; case "30001": description = "<h2>The state does not match. You may be a victim of CSRF.</h2>"; break; case "50001": description = "<h2>接口未授权</h2>"; break; default: description = "<h2>系统未知错误,请联系我们</h2>"; break; } Response.Write(description); Response.End(); } else { Response.Write("<h3>error:<h3>" + code + "<h3>msg:<h3>" + description); Response.End(); } }}5.web.config配置信息<appSettings> <!--QQ登录相关配置--> <add key="OAuth_QQ_AppId" value="123456789" /> <add key="OAuth_QQ_AppKey" value="25f9e794323b453885f5181f1b624d0b" /> <add key="OAuth_QQ_RedirectUrl" value="/oauth20/qqcallback.aspx" /> <!--新浪微博登录相关配置--> <add key="OAuth_Sina_AppKey" value="123456789" /> <add key="OAuth_Sina_AppSecret" value="25f9e794323b453885f5181f1b624d0b" /> <add key="OAuth_Sina_RedirectUrl" value="/oauth20/sinacallback.aspx" /> <!--微信登录相关配置--> <add key="OAuth_Weixin_AppId" value="wx123456789123" /> <add key="OAuth_Weixin_AppSecret" value="25f9e794323b453885f5181f1b624d0b" /> <add key="OAuth_Weixin_RedirectUrl" value="/oauth20/weixincallback.aspx" /></appSettings>。
ASP.NET(C#)实践教程(第2版)第十章数据显示和绑定
第 10 章
329
(C#)实践教程(第 2 版) 6.SqlDataSource SqlDataSource 控件是最常使用的一种数据源控件,它可以使用基于 SQL 关系的数 据库(如 SQL Server、Oracle、ODBC 以及 OLE DB 等)作为数据源,并从这些数据源 中检索数据。 SqlDataSource 控件可以将结果作为 DataReader 或 DataSet 对象返回。当结果作为 DataSet 返回时,该控件支持排序、筛选和缓存。使用 Micro点,那就是当数据库发生更改时,SqlCacheDependency 对象可使缓存结果 无效。 7.XmlDataSource XmlDataSource 控件常常用来访问 XML 文件或具有 XML 结构层次数据(如 XML 数据块) ,并向数据提供 XML 格式的层次数据。
数据显示和绑定 的数据源提供附加功能。 包含 7 种数据源控件,它们分别是 AccessDataSource、LinqDataSource、 ObjectDataSource、 EntityDataSource、 SiteMapDataSource、 SqlDataSource 和 XmlDataSource 控件。 1.AccessDataSource AccessDataSource 控件是 SqlDataSource 控件的专用版本, 专为使用 Microsoft Access mdb 文件而设计。与 SqlDataSource 控件一样,可以使用 SQL 语句来定义控件获取和检 索数据的方式。 2.LinqDataSource LinqDataSource 控件用于访问数据库实体类提供的数据。使用 LinqDataSource 控件 可以在 网页中使用 LINQ,从数据表或内存数据集合中检索数据。通过声明性 标记可以创建一个 LinqDataSource 控件,连接到数据库或内存中数据集合(如数组)中 的数据。 在声明的文本中可以编写对数据进行检索、 筛选、 排序和分组操作所需的所有条件。 从 SQL 数据库表检索数据时,也可以配置 LinqDataSource 控件来处理更新、插入和删除 操作。通过编写 SQL 命令执行这些任务,即可实现这种配置。与在其他数据源控件中执 行这些操作相比,使用 LinqDataSource 控件只编写较少代码就能执行相同的数据操作。 3.ObjectDataSource ObjectDataSource 控件能够将来自业务逻辑层的数据对象与表示层中的数据绑定, 实现数据的显示、编辑和删除等任务。它使用依赖业务层对象来管理数据的 Web 应用程 序 中 的 业 务 对 象 或 其 他 类 。 当 数 据 绑 定 控 件 ( 如 DropDownList 、 DataList ) 与 ObjectDataSource 控件交互以检索或修改数据时,ObjectDataSource 控件将值作为方法调 用中的参数,从绑定控件传递到源对象。 4.EntityDataSource EntityDataSource 控件允许绑定到基于实体数据模型(Entity Data Model,EDM)的 数据,支持自动生成更新、插入、删除和选择命令,还支持排序、筛选和分页的功能。 Entity Framework 在对象关系映射和其他方案(如 WCF 数据服务)中使用 EDM 。 EntityDataSource 控 件 支 持 将 Entity-SQL ( eSQL ) 作 为 查 询 语 言 , 并 且 支 持 由 ObjectQuery<T>类公开的查询规范。 5.SiteMapDataSource SiteMapDataSource 控件是站点地图数据的数据源, 这些数据存储在为网站配置的站 SiteMapDataSource 点地图提供程序中。使用 可以将那些并非专门作为站点导航控件的 Web 服务器控件(例如 TreeView 控件、Menu 控件和 DropDownList 控件)绑定到分层 的站点地图数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据绑定
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
数据绑定的三种方式
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
使用DataBind实现数据绑定
先设置DataSource 调用DataBind方法实现数据绑定 GridView控件可以绑定到集合类、 DataReader对象 DropDownList控件可以绑定到数组、数 组列表等数据结构、也可以保定到表格的 某一个列
• RepeatLayout 属性 • RepeatDirection 属性
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
DataList控件使用案例
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
还可以绑定到数据源
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
数据源控件
数据源控件 ObjectDataSource SqlDataSource 说明 允许绑定到业务对象,由该业务对象完成数据操 作,包括数据查询、添加、修改等 直接绑定到Microsoft SQL Server、OLE DB、 ODBC 或 Oracle 数据 直接绑定到Access数据库。数据源控件直接使用 SQL语句操作数据库,包括数据查询、添加、 修改等。 直接绑定到XML文件,这种绑定方式特别适用于 分层的 服务器控件,如 TreeView 或 Menu 控件 结合 站点导航使用。
第十一章 Web数据验证 和数据绑定
李勇平
回顾
异常处理技巧 数据访问的异常处理技巧 处理BLOB大数据 分页技术 数据访问安全
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
目标
数据验证
• 数据验证原理 • 数据验证控件
数据绑定的方式
ObjectDataSource数据源控件演示
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
数据绑定控件
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
GridView控件
使用SqlDataSource数据源控件和 GridView控件实现
验证控件使用案例
ValidateDemo.aspx RangeValidator属性设置
• ErrorMessage • Text • ControlToValidate • MinimumValue • MaximumValue • Type
查看客户端页面HTML源文件
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
使用数据绑定表达式
可以绑定到自定义属性
• <% =Name %>
可以绑定到控件的属性(案例)
• <% ="你选择的城市为: "+DropDownList1.SelectedItem.Tex t %>
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
FormView控件使用案例
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
DataList控件和Repeater控件
这两个控件都是绑定到数据源中所有符合 条件的记录,而且这两个控件都是通过模 板来定义每一条记录的显示样式 DataList控件
• ASP. NET2.0提供了大量的数据绑定控件,通过这些数 据绑定控件和数据源控件
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
课后作业
编写Web页面,使用GridView控件和 SqlDataSource控件显示Northwind数据库中 Orders表的数据。 编写Web页面,使用GridView控件和 SqlDataSource控件显示Northwind数据库中 Orders表的数据,并且当用户选中某一个订单项 时,使用GridView控件显示该订单项的[Order Detail]信息。 使用DetailsView控件向Northwind数据库中 Orders表插入数据,注意验证用户输入数据的有 效性。
• 数据显示 • 数据修改 • 数据删除
GridView控件模板概念
• 模板列
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
DetailsView控件和FormView控件
每一次只显示一条记录 DetailsView控件内置了使用表格的形式显 示一条记录 FormView控件没有内置显示模式
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
AccessDataSource
XmlDataSource
SiteMapDataSource
SqlDataSource数据源控件使用演示
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
本课小结
• 数据验证控件既可以实现Web数据的 客户端验证,还可以实现Web数据的服务器端验 证 • 数据绑定技术方便了数据显示过程,开发者可以 使用很少的代码实现数据的显示 • 2.0提供了三种方式实现数据绑定,其 中使用数据源控件可以实现双向的数据绑定。 • Web数据绑定的数据源可以是简单属性、表达式、 集合、也可以是集合中的某一个值
• DataBind数据绑定 • 数据绑定表达式 • 数据源控件
使用数据源控件和数据绑定控件实现数据绑定
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
数据验证
李勇平 高级培训讲师 Email:pinterlee@ QQ:6859870
数据验证控件
RequiredFieldValidator CompareValidator RangeValidator RegularExpressionValidator CustomValidator
李勇平 高级培训讲师 Email:pinterlee@tom.Байду номын сангаасom QQ:6859870