[How Do I]系列学习笔记——001:学习一些技巧
视频地址:http://www.asp.net/learn/videos/video-39.aspx
1、如何加密web.config中的重要信息。
在我们的web.config中经常要存放一些主要的信息(例如连接数据库的用户名和密码等),虽然我们的asp.net可以很好的防止客户端调用web.config文件,但是我们是不是还要采取另外一些防护措施来保护我们的信息,这里就有一种方法,利用加密来保存我们的重要信息。
正常情况下,我们的连接字符串总是如下的形式:
1: <connectionStrings>2: <add name="NorthwindConnectionString1" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True" providerName="System.Data.SqlClient"/>3: </connectionStrings>
但这是以明码的形式显示在文件中的。如果我们可以通过其它途径登陆到服务器上,就可以很轻松的获得连接信息。如果是下面这种形式就很难获得了:
1: <connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">2: <EncryptedData>3: <CipherData>4: <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAuvZz0B/W3k26o7RiVZ16rAQAAAACAAAAAAADZgAAqAAAABAAAABQ1buah/jiOzDXH85zXhcEAAAAAASAAACgAAAAEAAAAMEftvNgQN4UhEBcf/jVO7XAAQAAFs7UwJKCML4lMYY9h46srYhgPdAZJxozgid+P1UdvWqe0J1mqiEi1JY5M6le0Jb0Pe6H3vWAH8ct4oqvtWmGvOL+Y/C21CNiA3FfcPX6BJ12P3nPYm/QoA6+kfB8An663/4Cl1K8+WXVU6R/fZFl1pDK30j+LlUT8YF1eYvS3BNxMkxLbYd0rLp4aW6FQkX8zNeU5pCWiMGMK6etYR5qq2Ejr7lUGimuWr2NAQj3tZkZVjJaXbXkFR8ryS0Mpbko6EiZSPqZLiCiJxclMcAkO11jhNjXbZM8OXhVw3hlfCrNmYxgS6D9aYunYTGAzzFjd4wq4Fut3n34DhQbjlpg4dhOnM1VSFx/x2hM7qbHPZ02xKpsPp97q7cgn7yp+z4zKeDvzoCxAjlTVybqRiYyrXL2+mUJ41wfEYVVecifFB07t9dFFS0n4ifTp1IcA05EKerSkk7DURQp2GAAQ7ll8FsmMY/h1wEADsaixYM3WwYGbDc7kKQzvEwKTJuI8s45ZXW75BTWuSvqkgqoH6YJJGj4GVYMp2EmgUdwd5HjwgtgrS7gWxf9rhsF+Y0zZZAvTkCD6fY7AczTGDwlZXAnpRQAAACdtIG7MKkKY/djRke9mWSyRA13RA==</CipherValue>5: </CipherData>6: </EncryptedData>7: </connectionStrings>
好了,让我们来看看如何做吧。看如下方法:
1: private void EncryptConfig(bool encrypt)2: {3: Configuration config = WebConfigurationManager.OpenWebConfiguration("/WebSite10");
4: ConfigurationSection appConnSetting = config.GetSection("connectionStrings");
5:6: if (encrypt)
7: {8: appConnSetting.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
9: }10: else
11: {12: appConnSetting.SectionInformation.UnprotectSection();13: }14: config.Save();15: }
我想,此代码一出,大家都可以看懂了吧。(*^__^*) 嘻嘻……
2、让网页记住回发前的位置
其实就是在<%@ Page %>中加入MaintainScrollPositionOnPostback="true",好了,下一个技巧。
3、连个页面之间传递数据
现在我们有连个asp.net页面,Page1和Page2,在Page1上有一个TextBox,ID为“TextBox1”;一个Calendar,ID为“Calendar1”;还有一个Button。Page2上就有一个Label,用来显示从Page1中获得的数据。我们把Button的PostBackUrl设置为Page2.aspx页面,这样当我们点击这个Button时,数据就发送到了第二页面(page2.aspx),但是我们如何获取第一个页面(Page1.aspx)上的数据信息哪?看一下Page_Load中的代码:
1: protected void Page_Load(object sender, EventArgs e)2: {3: if (!Page.IsPostBack)
4: {5: TextBox t = PreviousPage.FindControl("TextBox1") as TextBox;6: Calendar c = PreviousPage.FindControl("Calendar1") as Calendar;7: if (t != null && c != null)8: {9: this.Label1.Text = String.Format("Hello {0}, you just clicked at {1}.", t.Text, c.SelectedDate.ToString());10: }11: else
12: {13: this.Label1.Text = "Something is wrong.";14: }15: }16: }
关键的一句就是PreviousPage.FindControl(),他接收一个string类型的参数,该参数为Page1上想要获得的空间的ID,其实通过PreviousPage.FindControl的字面意思我们也可以明白。呵呵,这里要注意一点,FindControl仅仅查找当前命名容器中的控件,如果我们正在寻找的控件驻留在另外一个控件(例如,一个模板)内,则需要先获得该容器的一个引用,然后搜索该容器以找到该控件。这样是不是很麻烦啊,呵呵,幸好我们还有一种解决方法
使用@PreviousPageType指令
加入在Page1中,有个TextBox,ID为TextBox1,我们就可以在后台CS代码中添加一个属性,如下:
1: public TextBox NameTextBox
2: {3: get {
4: return this.TextBox1;5: }6: }
然后我们在Page2使用@PreviousPageType指令:
<%@ PreviousPageType VirtualPath="~/Page1.aspx" %>
这样我们就可以在Page2中类似与这样的使用了:
Response.Write(PreviousPage.NameTextBox.Text);
哈哈,是不是很酷啊~?
在这里还是多说一些相关的东西吧。
检测跨页传递
作为一次跨页传递的潜在目标,很多时候我们往往不想让目标页面自动被激活,例如通过超链接。如果这样的话PreviousPage属性返回null,而其它与回发有关的属性则取通常值,例如IsPostBack。
所以我们应当在Page页面中插入一些代码来辨明页面行为,例如:
1: if (PreviousPage == null)2: {3: Response.Write("Sorry, This is something wrong~!");
4: Response.End();5: }
在这里我要提另外一个Page类属性IsCrossPagePostBack,如果当前页面调用了另一个ASP.NET页面,则该属性返回true,对应的,目标页面上的IsCrossPagePostBack总是false,因此下面的代码和上述代码是不等价的。
1: if (!this.IsCrossPagePostBack)2: {3: //......
4: }
要想知道当前页面是从另一个页中调来的,必须测试PreviousPage返回的页面对象上的IsCrossPagePostBack属性的值。
在这里还要注意一下,如果我们直接在浏览器中调用page2.aspx,那么我们就会得到一个异常——System.NullReferenceException: 未将对象引用设置到对象的实例。反应的是1: if (PreviousPage.IsCrossPagePostBack)
2: {3: Response.Write(PreviousPage.NameTextBox.Text);4: }
if (PreviousPage.IsCrossPagePostBack)
因为显然这时我们的饿PreviousPage是null。
最后,查看一个页面是否是通过跨页调用的最简单且最有效的方法是,检查PreviousPage是否为null。
3、Bulleted List Control
略
4、FileUpload Control
略
5、MutilView Control
略
6、URL Mapping
例如我们有一个很长的页面名字(例如:guid-{29BF9A6A-9F29-40ad-8391-BD1F52457F15}.htm),如果我们简单的在浏览器中显示的势必会不怎么没关,试想一下,如果我们把它换成guid.htm是不是清爽了很多,呵呵,这里我们就用URLMapping来处理吧。
简单很在web.config文件中的system.web一节插入如下:
<urlMappings> <add url="~/guid.htm" mappedUrl="guid-{29BF9A6A-9F29-40ad-8391-BD1F52457F15}.htm"/> </urlMappings>呵呵,这样我们就可以在浏览器中使用“...../guid.htm”来访问了。