posts - 33,  comments - 86,  trackbacks - 0
  2008年10月11日

今天自己用网上一个关于WordPress的一个皮肤做为模板做了一个BlogEngine的皮肤,呵呵,自己挺喜欢的。

另外在做它时,学到了很多的css知识(我最讨厌和美工有关的东西了,因为自己在这方面很白痴),下面是截图和皮肤文件。

image

posted @ 2008-10-11 23:59 啊不才 阅读(16) | 评论 (0)编辑
  2008年9月15日

视频地址: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 @ 2008-09-15 17:40 啊不才 阅读(98) | 评论 (0)编辑
  2008年7月29日
习惯先贴代码:
Code

 

 

下面是执行结果:

A.Fun()
B.Fun() using 'override'
BB.Fun() using 'new'
~~~~~~~~~~~~~~~~~~`
B.Fun() using 'override'
A.Fun()
A ab = new B(); ab's type is B
But ab is also A

 

好了,让我们来分析一下吧。

代码的前一部分就是“~~~~~~~~~~”之上,应该没有什么好说的了。

关键就是接下来声明“A ab = new B();”后,如果对父类的虚函数方法在子类中使用了override重写,则执行的是子类中的方法。如果在子类中是使用new来重写父类的方法,则执行的是父类的方法。

在这里,我们可以这样来理解,override就好比一个橡皮擦,当它出现时,直接擦除父类的方法,然后把自己的放在上面。

如果我们在子类中用的是new,则打个比方就是没有那个橡皮擦,该是谁的就是谁的。

posted @ 2008-07-29 22:15 啊不才 阅读(43) | 评论 (0)编辑
  2008年7月5日
最近园子里流行做俄罗斯乌拉尔大学在线题库我也就做了一下,下面是1000题和1001题的代码:
Problem 1000:
1int main()
2{
3    int a, b;
4    clrscr();
5    scanf("%d %d"&a, &b);
6    printf("%d", a+b);
7}
Problem 1001:
 1using System;
 2using System.Threading;
 3using System.Globalization;
 4
 5namespace ConsoleApplication4
 6{
 7    class Program
 8    {
 9        static void Main(string[] args)
10        {
11            // 注意下面一行代码,如果少了的话,你永远也通过不了,哈哈
12            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
13            string[] inputArray = Console.In.ReadToEnd().Split();
14            for (int i = inputArray.Length - 1; i >= 0; i--)
15            {
16                if (!String.IsNullOrEmpty(inputArray[i]))
17                {
18                    Console.WriteLine("{0:F4}", Math.Sqrt(Convert.ToDouble(inputArray[i])));
19                }

20            }

21        }

22    }

23}
原因是什么,在这里有人解释了,注意看回复的第二楼。
posted @ 2008-07-05 23:20 啊不才 阅读(66) | 评论 (0)编辑
  2008年7月3日
is操作符是检查一个对象是不是兼容于指定的类型,并返回一个Boolean值:true或false。因此is操作符永远不会抛出异常。
例如如下代码:
1Object o = new Object();
2Boolean b1 = (o is Object); //b1 is true
3Boolean b2 = (o is Student); //b2 is false
如果对象是null引用,则总是返回false。

那么as是用来干吗的哪?还是让我们先来看一段代码吧:
1if (o is Student)
2{
3    Student s = (Student)o;
4    // do rest things
5}
在上段代码中,CLR实际上会检查两次对象的类型。第一次是is操作符核实o是否兼容于Student类型。如果答案是肯定的,那么进入if内部,执行第一句就出现类型转化,这时CLR再次核实o是否引用了一个Student。
这里CLR的类型检查增强了安全性,但是同时也无疑会对性能造成一定的影响,因为CLR首先必须判断变量o引用的对象是实际的对象,然后CLR必须遍历继承层次结构,用每个基类型去核对指定的类型Student。
正是因为这是一个非常常用的功能,所以C#专门的提供了一个as操作符,目的就是为了简化这种代码的编写,同时提升性能。
1Student s = o as Student;
2if (s != null)
3{
4    // do rest things
5}
这里就只检查了一次,CLR核实o是否兼容于Student类型,如果是,则返回对同一个对象的一个非null的引用。如果不兼容于Student类型,as操作符就会返回null。这里需要说明一下if语句只是检查s是否为null,这个过程相较于校验对象的类型,这个检查能更快的执行。
posted @ 2008-07-03 23:51 啊不才 阅读(73) | 评论 (0)编辑
  2008年6月16日
一直一来学习东西都不是很仔细,经常被一些小问题耽误了很多时间。(记住一定要改正这个缺点,细节决定成败)

Master属性是内容页和母版页之间的一个沟通桥梁,但是如果我们在内容页面直接使用的话就会遇到我的问题,编译无法通过,说Master没有该属性,奇怪啊,我明明在Master页面代码里用public定义了一个属性啊,为什么在Content页面却死活看不见,气人~!

后来通过Google搜索和朋友的帮助终于知道自己错在哪里了,因为Master属性被定义为MasterPage类型,因此它是不知道我们实际为Master页面定义的任何属性或方法的相关信息的。为了让我们的Master属性知道我们对它做的手脚,就必须使用以下的方法来做:
  • 强制转换:使用Master实际的类型做强制类型转换。
  • 强类型化:如果你用的很多,是不是每次都强制类型转化很是麻烦啊,恩,M$肯定会替你想到的,因此我们可以在页面上添加@MasterType指令,它里面包含连个互斥的属性:VirtualPath和TypeName。前者通过URL指出,后者通过类型名指出。
参考图书:
  • 《ASP.NET 2.0 技术内幕》ISBN:7-302-13429-4
  • 《ASP.NET 2.0 高级编程》(第四版)ISBN:7-302-13906-7

posted @ 2008-06-16 20:44 啊不才 阅读(99) | 评论 (0)编辑
  2008年5月28日

当我输入:http://notepad-plus.sourceforge.net 想在网上下一个最新的NotePad++(V4.9.2)时,却看到了这样一个网页,真的太让你气愤了,我真的很气愤,再也不想用NotePad++了,大家看看吧~!
网址是:http://notepad-plus.sourceforge.net/tw/site.htm


http://notepad-plus.sourceforge.net/tw/whyBoycotting.php?lang=tw

posted @ 2008-05-28 23:22 啊不才 阅读(61) | 评论 (2)编辑
  2008年5月22日
大家可以查看以下视频:
http://nyveldt.com/misc/BE13SQLBlogProvider.html
posted @ 2008-05-22 01:02 啊不才 阅读(52) | 评论 (0)编辑
  2008年5月9日
在学校Ajax时遇到了一个小问题,先来看一下原来的代码:
 1<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="MSDNWebCast_20070621.WebForm1" %>
 2
 3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4
 5<html xmlns="http://www.w3.org/1999/xhtml" >
 6<head runat="server">
 7    <title>Untitled Page</title>
 8    <script language="javascript" type="text/javascript">
 9    Type.registerNamespace('Demo');
10    
11    Demo.Person = function(firstName, lastName, emailAddress)
12    {
13        this._firstName = firstName;
14        this._lastName = lastName;
15        this._emailAddress = emailAddress;
16    }

17
</script>
18</head>
19<body>
20    <form id="form1" runat="server">
21    <asp:ScriptManager ID="ScriptManager1" runat="server">
22    </asp:ScriptManager>
23    <div>
24    
25    </div>
26    </form>
27</body>
28
29</html>
30
在运行时会弹出如下图所示的错误:

然后我就纳闷了,怎么会这样?很是郁闷~~!其实我们只要把<Script>代码块放到asp:ScriptManager的后面,问题就解决了。
正确的代码如下:
 1<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="MSDNWebCast_20070621.WebForm1" %>
 2
 3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4
 5<html xmlns="http://www.w3.org/1999/xhtml" >
 6<head runat="server">
 7    <title>Untitled Page</title>
 8