
重点总结 目前为止在ASP.NET网页中传递数据的方式至少有5种: 1、通过查询字符串传递数据。 2、通过HTTP POST传递数据。 3、通过会话状态传递数据。 4、通过源页的公共属性传递数据。 5、通过源页中的控件值传递数据。 到底使用哪种方式来进行数据的传递,这可能受到两方面的影响: 1、页面重定向的方式。 2、源页和目标页是否位于相同的ASP.NET应用程序中。 如果源页和目标页位于不同的ASP.NET应用程序中则只能通过查询字符串和HTTP POST传递数据。 而如果源页和目标页位于相同的ASP.NET应用程序中,则可以使用五种方式中的任意一种。 一、通过查询字符串传递数据 下面的两个URL,第一个只传递了产品编号,第二个不仅传递了产品编号,同时也传递产品名称。http://localhost/Demo/DestinationPage.aspx?ProductID=777http://localhost/Demo/DestinationPage.aspx?ProductID=777&ProductName=Glass 在目标页中则可以通过Page.Request.QueryString属性来获取查询字符串中传递的键值。比如下面的代码: view sourceprint?1 this.Response.Write(this.Request.QueryString["ProductID"]); 2 this.Response.Write("<br />"); 3 this.Response.Write(string.Format("ProductID={0} ProductName={1}", 4 this.Request.QueryString["ProductID"], 5 this.Request.QueryString["ProductName"])); 二、通过HTTP POST传递数据 此示例代码在源页中,为用户提供了输入用户名、生日和年龄的文本框,并且将Button控件的PostBackUrl属性设置为DestinationPage.aspx。也就是说当单击【提交到目标页】按钮后,源页窗体的数据会被传递到DestinationPage.aspx页面。 在目标页中则通过Page.Request.Form属性来获取这些传递过来的数据。 源页的页面源码如下: view sourceprint?01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> 02 03 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 04 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 05 <html xmlns="http://www.w3.org/1999/xhtml"> 06 <head runat="server"> 07 <title>源页!</title> 08 </head> 09 <body> 10 <form id="form1" runat="server"> 11 <div> 12 User Name : 13 <asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> 14 <br /> 15 Birth Date : 16 <asp:TextBox ID="BirthDateTextBox" runat="server"></asp:TextBox> 17 <br /> 18 Age : 19 <asp:TextBox ID="AgeTextBox" runat="server"></asp:TextBox> 20 <br /> 21 <asp:Button ID="SubmitButton" runat="server" Text="提交到目标页" 22 PostBackUrl="~/DestinationPage.aspx" /> 23 </div> 24 </form> 25 </body> 26 </html> 目标页中获取源页窗体数据的代码如下: view sourceprint?01 protected void Page_Load(object sender, EventArgs e) 02 { 03 StringBuilder SBuilder = new StringBuilder(); 04 NameValueCollection PostedValues = 05 this.Request.Form; 06 07 for (int Index = 0; Index < PostedValues.Count; Index++) 08 { 09 if (PostedValues.Keys[Index].Substring(0, 2) != "__") 10 { 11 SBuilder.Append(string.Format("{0} = {1}", 12 PostedValues.Keys[Index], 13 PostedValues[Index])); 14 SBuilder.Append("<br />"); 15 } 16 } 17 18 this.Response.Write(SBuilder.ToString()); 19 } 代码中的if语句主要是为了避免获取以两个下划线__开头的隐藏字段的数据,比如__VIEWSTATE、__EVENTTARGET、__EVENTARGUMENT。当然也可以去掉这个if语句,然后就能同时获取这些隐藏字段的数据了。 三、通过会话状态传递数据 使用会话状态的好处是可以在与源页处于相同ASP.NET应用程序的所有网页间共享数据。缺点是会增加服务器的内存开销。 下面的代码中,用户在源页的【用户名】文本框中输入自己的姓名,然后单击【提交数据】按钮。服务器代码会通过Page.Session属性将用户名存储到会话状态中,然后使用Response.Redirect()方法将页面强制重定向到另外一个页面(DestinationPage.aspx)。在这个目标页面中再次通过Page.Session属性来获取用户在源页中保存的用户名。 源页的源代码如下: view sourceprint?01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> 02 03 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 04 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 05 <html xmlns="http://www.w3.org/1999/xhtml"> 06 <head runat="server"> 07 <title>源页:通过会话状态传递数据!</title> 08 </head> 09 <body> 10 <form id="form1" runat="server"> 11 <div> 12 用户名: 13 <asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> 14 <asp:Button ID="SubmitButton" runat="server" Text="提交数据" 15 onclick="SubmitButton_Click" /> 16 </div> 17 </form> 18 </body> 19 </html> 源页中用来保存用户名到会话状态并重定向到目标页的代码如下: view sourceprint?1 protected void SubmitButton_Click(object sender, EventArgs e) 2 { 3 this.Session["UserName"] = this.UserNameTextBox.Text; 4 this.Response.Redirect("DestinationPage.aspx"); 5 } 目标页中获取保存在会话状态中的用户名的代码如下: view sourceprint?1 protected void Page_Load(object sender, EventArgs e) 2 { 3 string UserName = this.Session["UserName"].ToString(); 4 this.Response.Write(UserName); 5 } 四、通过源页的公共属性传递数据 在示例代码中,我们在源页中提供了一个输入用户名的文本框,然后通过单击【提交到目标页】按钮将数据提交到目标页。 源页的源代码如下: view sourceprint?01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> 02 03 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 04 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 05 <html xmlns="http://www.w3.org/1999/xhtml"> 06 <head runat="server"> 07 <title>源页:通过公共属性传递数据!</title> 08 </head> 09 <body> 10 <form id="form1" runat="server"> 11 <div> 12 用户名:<asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> 13 <br /> 14 <asp:Button ID="SubmitButton" runat="server" Text="提交到目标页" 15 PostBackUrl="~/DestinationPage.aspx" /> 16 </div> 17 </form> 18 </body> 19 </html> 并且为源页定义了一个名为UserName的公共属性,此属性返回的是【用户名】文本框中输入的用户名。 view sourceprint?1 public string UserName 2 { 3 get { return this.UserNameTextBox.Text; } 4 } 这样我们就创建了一个包含公共属性的源页。接着创建目标页,并且为目标页添加@PreviousPageType指令,当然也可以使用@Reference指令。 view sourceprint?1 <%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %> 这样,ASP.NET就会自动将目标页的Page.PreviousPage属性转换为源页的类型,从而就可以直接访问UserName属性。注意观察下面的代码,我们并没有将Page.PreviousPage进行显示的类型转换。 view sourceprint?1 if (this.PreviousPage != null) 2 { 3 string UserName = this.PreviousPage.UserName; 4 this.Response.Write(UserName); 5 } 需要特别强调的是不要忘记判断Page.PreviousPage属性是否为null,因为它确实有为null的可能性。如果在为null的情况下获取UserName这个源页的公共属性,那是会跳出异常的。 五、通过源页中的控件值传递数据 这最后一种传递数据的方式就是直接获取源页的控件对象了,然后通过控件的属性值来获取所需的数据。比如本示例代码中,我们就是通过获取源页的TextBox控件,然后通过访问TextBox.Text属性来获取用户在源页中输入的数据。 下面的示例代码中,我们在源页放置了一个输入用户名的文本框,ID为UserNameTextBox。通过Page.PreviousPage.FindControl()方法就可以获取此控件的引用。 源页的源代码如下: view sourceprint?01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> 02 03 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 04 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 05 <html xmlns="http://www.w3.org/1999/xhtml"> 06 <head runat="server"> 07 <title>源页:通过控件属性传递数据!</title> 08 </head> 09 <body> 10 <form id="form1" runat="server"> 11 <div> 12 用户名:<asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> 13 <br /> 14 <asp:Button ID="SubmitButton" runat="server" Text="提交到目标页" 15 PostBackUrl="~/DestinationPage.aspx" /> 16 </div> 17 </form> 18 </body> 19 </html> 目标页中获取文本框控件,并获取其Text属性值的代码如下: view sourceprint?1 if (this.PreviousPage != null) 2 { 3 TextBox UserNameTextBox = 4 (TextBox)this.PreviousPage.FindControl("UserNameTextBox"); 5 if (UserNameTextBox != null) 6 { 7 this.Response.Write(UserNameTextBox.Text); 8 } 9 } 如果所要获取的控件位于某个控件的内部,比如下面的代码,UserNameTextBox控件位于名为UserPanel的Panel控件内部。那么首先找出这个Panel控件,然后通过此控件的FindControl()方法找出内部的文本框控件。 源页的源代码如下: view sourceprint?01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> 02 03 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 04 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 05 <html xmlns="http://www.w3.org/1999/xhtml"> 06 <head runat="server"> 07 <title>源页:通过控件属性传递数据!</title> 08 </head> 09 <body> 10 <form id="form1" runat="server"> 11 <div> 12 <asp:Panel ID="UserPanel" runat="server"> 13 用户名:<asp:TextBox ID="UserNameTextBoxInPanel" runat="server"></asp:TextBox> 14 <br /> 15 <asp:Button ID="SubmitButtonInPanel" runat="server" Text="提交到目标页" 16 PostBackUrl="~/DestinationPage.aspx" /> 17 </asp:Panel> 18 </div> 19 </form> 20 </body> 21 </html> 目标页中获取这个位于Panel控件内部的TextBox控件的代码如下: view sourceprint?01 if (this.PreviousPage != null) 02 { 03 Panel UserPanel = (Panel)this.PreviousPage.FindControl("UserPanel"); 04 if (UserPanel != null) 05 { 06 TextBox UserNameTextBox = 07 (TextBox)UserPanel.FindControl("UserNameTextBoxInPanel"); 08 if (UserNameTextBox != null) 09 { 10 this.Response.Write(UserNameTextBox.Text); 11 } 12 } 13 } 不管控件位于那个级别的命名容器控件内部,都是通过这种方式来获取的。 一定不要忘记判断所获取的控件引用是否为null。 本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/archive/2010/11/10/1873260.html,如需转载请自行联系原作者
YSlow分析网页,并提出如何提高其性能的基础上一套规则,高性能的网页。我搜索一下”Yslow使用说明“,发现都是旧版本Yslow的使用介绍。于是翻译了一下yahoo官方关于新版Yslow的的使用帮助,希望给初次使用Yslow的朋友一些帮助。 注:英文不是很好,对着翻译软件翻译的,有不对的地方,大家指正。 安装 YSlow 先安装 Firebug https://addons.mozilla.org/en-US/firefox/addon/1843 Firebug 帮助文档 http://www.getfirebug.com/docs.html. 再下载安装 http://developer.yahoo.com/yslow 使用Yslow Yslow是运行在Firebug窗口下,所有要运行Yslow,必须安装Firebug。 有两种方法启动Yslow 1、打开Firebug窗口,选择Yslow选项。 2、直接点击浏览器右下角的Yslow启动按钮。 你第一次打开Yslow时,以下图像作为Firebug的一部分被显示在的浏览器窗口。 点击 Run Test 运行Yslow,也可以点击 Grade, Components, 或Statistics选项开始对页面的分析。 你可以选择 Autorun YSlow each time a web page is loaded 它将自动对以后打开页面进行分析,您也可以右击YSlow状态栏,然后选择或取消自动运行。 Yslow视图 YSlow显示测试结果的分析,分为等级、组件、统计信息。你可以浏览这些观点之间选择标签以观的名字在YSlow标签的Firebug控制台。 以下是说明的等级、组件、统计信息。 一、等级视图 查看一个分析,选择页面的性能等级标签或点击网页的字母等级在状态栏这页纸的底部。 视图显示了等级为网页的成绩单。整个字母等级为页面显示在顶部随着全面数值的表现。这个页面是基于22可分级的高性能网页的规则(见性能规则)。这些规则是列在按重要性的顺序,从最重要不重要。从 A 级到 F 级,A 级为最高。 下面是一个等级的例子: 如果页面与某一个规则无关,则显示 N/A ,表示不适用。 点击每一规则,都给出了改进建议。要查看更全面的改进方法进入前端性能优化指南 二、组件视图 分组显示页面组件,表格列出组件的信息,点击 Expand All展开显示给个分组内各的组件信息。 下面简要列在组件检视表: TYPE:该组件的类型。该网页是由组成部分的下列类型: doc, js, css, flash, cssimage, image, redirect, favicon, xhr, and iframe. SIZE(KB):该组件的大小以千字节。 GZIP(KB):该组件的gzip压缩的大小以千字节。 COOKIE RECEIVED(bytes):字节数在HTTP设置的Cookie响应头。 COOKIE SENT(bytes):节数的Cookie在HTTP请求报头 HEADERS:HTTP信息头,点击放大镜查看全面信息。 URL:链接地址 EXPIRES(Y/M/D):日期的Expires头,属于缓存设置一种。 RESPONSE TIME (ms):响应时间 ETAG:ETag响应头,也是缓存设置的一种 ACTION:额外的性能分析 三、统计信息视图 左侧图表显示是页面元素在空缓存的加载情况,右侧为页面元素使用缓存后的页面加载情况。我们可以看到,页面元素缓存后的使页面的http请求和页面总大小都减少,从而加快了页面打开时间。参看(页面的缓存设置) YSlow菜单栏 一、规则集 1 、YSlow ( 2版) -这一规则集包含了所有22个测试的规则。 2 、精英( V1导联) -这个规则集包含原始13规则中使用了YSlow 1.0 。 3、小网站或博客-这个规则集包含14个规则,适用于小型网站或博客。参照下方的图片,看看哪一种规则,在这个规则集。 请注意,最后选定的规则集成为默认的规则集。默认规则集可以是一个预定义的三个之一或您自己创建的一个。 要创建您自己的规则集,单击Rulesets下拉菜单旁边的 Edit 按钮。新的规则集屏幕将显示: 1、点击左侧 New Set 按钮,出现全部22调规则,勾选你所需的 2、点击 Save ruleset as... 保存,会弹出个命名窗口,命名就可以了。 3、你还可以对自定义的规则再次编辑或者删除。 YSlow 工具 YSlow的工具菜单上提供了多种报告工具,您可以使用获得的信息,以帮助您的网页分析。以下是截图工具菜单: 1、JSLint JSLint收集所有外部和内部的JavaScript从目前的网页,提交给JSLint ,一个JavaScript验证,并打开一个单独的窗口了一份报告,存在问题,该网页的JavaScript的。该报告包括大致位置的源代码的问题。很多 时候,这些问题是语法错误,但JSLint寻找风格公约的问题和结构性问题。 2、All JS 收集所有外部和内部的JavaScript的网页,并显示在一个单独的脚本窗口。您可能想要使用这个工具来查看某个脚本,以及是否实际使用是正确的。 3、All JS Beautified 将js以人们可读的方式展示。 4、All JS Minified 收集所有外部和内嵌JavaScript,删除评论和白色空间以缩小的脚本。以改善网页的性能。 5、All SS 收集所有的行内和外部的样式表在网页上,并将其显示在一个单独的窗口。 6、All Smush.it 如果您按一下所有Smush.it , Smush.it将运行在网页上所有的图片组成。此工具将告诉你该图像可被优化,并创建一个压缩文件,来优化图像。当您选择此工具你会看到输出如下所示: 以上就是Yslow的使用指南,结束。 本文转自黄聪博客园博客,原文链接:http://www.cnblogs.com/huangcong/archive/2011/03/11/1981107.html,如需转载请自行联系原作者
在C#中连接MySql数据库其实是件很简单的事情,但对于刚开始学习C#的朋友来说,问题却是不小,主要原因是相对于ACCESS和MSSql 来说,MySql方面的教程文章实在太少,我也是自己摸索好好半天才搞清楚的,呵呵。这篇文章可算不上教程,我主要是担心,怕自己以后会忘记,写在这里, 方便以后查看而已,呵呵。 1、要安装一个 MySQLDriverCS-n-EasyQueryTools-4.0.0-DotNet2.0 这东西可不太好找,只能去MySql的官方网站上下载。 下载地址 mysql-connector-net-5.0.9.exe 如果不能下载的话,那就直接到官方网站上去下载。 2、安装完成之后,在C#中添加引用,然后找到MySql.Data,引用到当前项目中,就可以使用了。 3、具体的使用方法: ① using MySql.Data.MySqlClient; ② 数据库的连接 MySqlConnection Conn= new MySqlConnection("Database=phpcms2008;Data Source=localhost;User Id=root;Password="); ③ 记录表的读取 MySqlDataAdapter Da= new MySqlDataAdapter("select * from phpcms2008_category where parentid=0", Conn); ④ 后继操作,这里就不用多说了 好了,MySql数据库就算是连接成功了!!! 本文转自黄聪博客园博客,原文链接:http://www.cnblogs.com/huangcong/archive/2011/03/26/1996456.html,如需转载请自行联系原作者
本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2008/08/19/1271702.html,如需转载请自行联系原作者
PostedFile.ContentType这个属性通常用来判断上传文件的MIME类型,我们通常以此来拒绝某些类型的上传,比如仅允许上传图像文件,然而这个属性其实是很不稳定的: MIME类型没有统一 假如我们希望仅允许上传jpg文件,那么通常做法就是判断上传文件的ContentType是否为“image/jpeg”,不是则拒绝,着看起来很简单,但是实际上这个网站通过Chrome浏览和使用时不会有问题,但使用IE(测试时使用的是IE8)上传jpg文件就会遭拒了,经过调试,发现IE上传时的ContentType是“image/pjpeg”。 这还仅限于两个浏览器、一种文件格式的情况,如果是多家浏览器多种文件格式的话,要兼顾就有得头疼了。 在我简单的几下测试中,发现的其他区别有: png文件Chrome提交的ContentType为image/png,而IE提交为image/x-png zip、rar、msi等文件使用Chrome提交的ContentType都为null,IE可以正确获取 可靠性与安全性低 由上一个问题很容易就想出:MIME类型完全是由客户端说了算的 而既然是客户端的东西,那就是不可信的,因为用户完全可以使用非主流浏览器或是恶意程序进行欺骗。 比如将可执行文件伪装为图像的MIME骗过服务端的检查,而如果你正好在服务端存储时仍保留了原文件的扩展名的话,就非常危险了。 (比如通过欺骗上传了一个aspx文件,然后就可以通过访问其url直接执行了) 结语 为今除了这个属性之外,还是没有什么更好的方法来获取上传文件真实类型的,所以只能继续使用,但要记住需在兼容性和安全性两方面多下功夫,否则会很郁闷。 本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2010/09/12/1824549.html,如需转载请自行联系原作者