[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属性的值。

 

  1: if (PreviousPage.IsCrossPagePostBack)
  2: {
  3:     Response.Write(PreviousPage.NameTextBox.Text);
  4: }
在这里还要注意一下,如果我们直接在浏览器中调用page2.aspx,那么我们就会得到一个异常——System.NullReferenceException: 未将对象引用设置到对象的实例。反应的是
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”来访问了。

posted on 2008-09-15 17:40  啊不才  阅读(688)  评论(0编辑  收藏  举报

导航