<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_jintianhu</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/45785/rss</id><updated>2011-11-26T08:00:11Z</updated><author><name>小小娟</name><uri>http://www.cnblogs.com/jintianhu/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jintianhu/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/45785/rss"/><entry><id>http://www.cnblogs.com/jintianhu/archive/2011/11/26/2264375.html</id><title type="text">解决DESCryptoServiceProvider加解密时弱密钥异常</title><summary type="text">DES算法的密钥是8字节，由于其算法的特性所致，有一些密钥是不安全的，比如0xFF0xFF0xFF0xFF0xFF0xFF0xFF0xFF，用该密钥对数据进行加密与解密运算，得到的结果是一样的，这样的密钥被称为弱密钥。在.NET中我们一般用DESCryptoServiceProvider来进行DES运算，但是该类会去检测传入的密钥是否为弱密钥，如果是，就直接抛出异常。先看下面的代码： 1 public static string DESEncode(byte[] str, byte[] key) 2 { 3 DESCryptoSe...</summary><published>2011-11-26T08:00:00Z</published><updated>2011-11-26T08:00:00Z</updated><author><name>小小娟</name><uri>http://www.cnblogs.com/jintianhu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jintianhu/archive/2011/11/26/2264375.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jintianhu/archive/2011/11/26/2264375.html"/><content type="html">&lt;p&gt;DES算法的密钥是8字节，由于其算法的特性所致，有一些密钥是不安全的，比如0xFF0xFF0xFF0xFF0xFF0xFF0xFF0xFF，&lt;br /&gt;用该密钥对数据进行加密与解密运算，得到的结果是一样的，这样的密钥被称为弱密钥。在.NET中我们一般用DESCryptoServiceProvider&lt;br /&gt;来进行DES运算，但是该类会去检测传入的密钥是否为弱密钥，如果是，就直接抛出异常。先看下面的代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; DESEncode(&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] str, &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] key)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt;                 DESCryptoServiceProvider des = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DESCryptoServiceProvider();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt;                 des.Mode = CipherMode.ECB;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt;                 des.Padding = PaddingMode.None;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt;                 des.Key = key;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt;                 ICryptoTransform desCrypt = des.CreateEncryptor();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] result = desCrypt.TransformFinalBlock(str, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, str.Length);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; BitConverter.ToString(result).Replace(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;-&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;""&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;         }&lt;/div&gt;&lt;p&gt;上面的代码网上到处能找到，但是如果你传入0xFF0xFF0xFF0xFF0xFF0xFF0xFF0xFF这样的密钥，在des.Key = key;这一行就会抛出&lt;br /&gt;&amp;ldquo;不能为弱密钥&amp;rdquo;的异常。这在正常情况下是没问题的，微软为我们考虑的很周到，强制我们不要用安全性低的弱密钥。但是有时需求是万变&lt;br /&gt;的，比如你操作的是一个硬件设备，往它里面写入一个密钥，但是厂家规定了第一次写入时必须用8个0xFF密钥进行加密，后面就用原密钥加密后&lt;br /&gt;写入（银行的金融POS机几乎都是这种模式的），那岂不是就没法用C#来操作了吗？&lt;br /&gt;我之前也是这么认为的，甚至都决定用C写个DES算法（这个网上有现成的），编译成DLL后用C#去调用。后来想到了反射，去绕过弱密钥的检测。&lt;br /&gt;于是我先反编译了DESCryptoServiceProvider.Key这个属性的set方法，看看里面做了什么操作：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] Key&lt;br /&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt;     {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (value == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;value&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.ValidKeySize(value.Length * &lt;span style="color: #800080;"&gt;8&lt;/span&gt;))&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ArgumentException(Environment.GetResourceString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Cryptography_InvalidKeySize&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (IsWeakKey(value))&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; CryptographicException(Environment.GetResourceString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Cryptography_InvalidKey_Weak&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DES&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (IsSemiWeakKey(value))&lt;br /&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; CryptographicException(Environment.GetResourceString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Cryptography_InvalidKey_SemiWeak&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DES&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.KeyValue = (&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[]) value.Clone();&lt;br /&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.KeySizeValue = value.Length * &lt;span style="color: #800080;"&gt;8&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; }&lt;/div&gt;&lt;p&gt;Key这个属性是DESCryptoServiceProvider的父类DES类的属性。果然，我们在里面发现了检测弱密钥的代码if (IsWeakKey(value))和&lt;br /&gt;if (IsSemiWeakKey(value))，后者是检测半弱密钥的。那么抛除前面的检测语句，真正有作用的只有这两句&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.KeyValue = (&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[]) value.Clone();&lt;br /&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.KeySizeValue = value.Length * &lt;span style="color: #800080;"&gt;8&lt;/span&gt;;&lt;/div&gt;&lt;p&gt;那么，下面的事情就明朗了，用反射去对这两个属性进行赋值&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; DESEncode(&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] str, &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] key)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt;             DESCryptoServiceProvider des = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DESCryptoServiceProvider();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt;             des.Mode = CipherMode.ECB;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt;             des.Padding = PaddingMode.None;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt;             FieldInfo fi = des.GetType().GetField(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;KeyValue&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, BindingFlags.Instance | BindingFlags.NonPublic);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt;             fi.SetValue(des, key);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt;             fi = des.GetType().GetField(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;KeySizeValue&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, BindingFlags.Instance | BindingFlags.NonPublic);&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;             fi.SetValue(des, key.Length * &lt;span style="color: #800080;"&gt;8&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;             ICryptoTransform desCrypt = des.CreateEncryptor();&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] result = desCrypt.TransformFinalBlock(str, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, str.Length);&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; BitConverter.ToString(result).Replace(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;-&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;""&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;         }&lt;/div&gt;&lt;p&gt;这时发现des.CreateEncryptor()这句还是抛出弱密钥异常，继续反编译&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; ICryptoTransform CreateEncryptor()&lt;br /&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.CreateEncryptor(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Key, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.IV);&lt;br /&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; }&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; ICryptoTransform CreateEncryptor(&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] rgbKey, &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] rgbIV)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (DES.IsWeakKey(rgbKey))&lt;br /&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt;     {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; CryptographicException(Environment.GetResourceString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Cryptography_InvalidKey_Weak&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DES&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (DES.IsSemiWeakKey(rgbKey))&lt;br /&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt;     {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; CryptographicException(Environment.GetResourceString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Cryptography_InvalidKey_SemiWeak&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;), &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DES&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;._NewEncryptor(rgbKey, &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.ModeValue, rgbIV, &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.FeedbackSizeValue, CryptoAPITransformMode.Encrypt);&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; }&lt;/div&gt;&lt;p&gt;它里面果然又进行了一次弱密钥判断，最终调用的是_NewEncryptor这个私有方法，于是就要反射去调用它。注意参数里的rgbIV是向量，&lt;br /&gt;feedbackSize不清楚是干嘛的，但是这两个参数在ECB加解密模式下是不需要的，可以随便传。CryptoAPITransformMode这个枚举是internal的,&lt;br /&gt;一样要用反射去得到。最终的代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; DESEncode(&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] str, &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] key)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt;             DESCryptoServiceProvider des = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DESCryptoServiceProvider();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt;             des.Padding = PaddingMode.None;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt;             Type t = Type.GetType(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;System.Security.Cryptography.CryptoAPITransformMode&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; obj = t.GetField(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Encrypt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt;             MethodInfo mi = des.GetType().GetMethod(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;_NewEncryptor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, BindingFlags.Instance | BindingFlags.NonPublic);&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;             ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(des, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;[] { key, CipherMode.ECB, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, obj });&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] result = desCrypt.TransformFinalBlock(str, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, str.Length);&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; BitConverter.ToString(result).Replace(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;-&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;""&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;         }&lt;/div&gt;&lt;p&gt;以上是DES的加密代码，DES的解密、3DES的加解密与之类似，就不一一写了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jintianhu/aggbug/2264375.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jintianhu/archive/2011/11/26/2264375.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jintianhu/archive/2011/09/23/2186664.html</id><title type="text">SQL模糊查询时特殊字符的处理方式总结</title><summary type="text">当编写WHERE语句中有LIKE条件时，如果参数中需要匹配 % 和_ 等特殊字符时，必须进行处理，否则系统会将其当成通配符处理。SqlServer：有两种方案一：将参数中的[ 替换成 [[]， % 替换成 [%]， _ 替换成 [_]；（推荐用这种方案处理）二：先将参数中的\ 替换成 \\，[替换成\[ ， % 替换成 \%， _ 替换成 \_；然后在每个需要like查询的字段后加上escape '\'。注：sqlserver2005测试通过Oracle只能既改参数，又改SQL语句。先将参数中的\ 替换成 \\， % 替换成 \%， _ 替换成 \_；然后在每个需要like查询</summary><published>2011-09-23T12:24:00Z</published><updated>2011-09-23T12:24:00Z</updated><author><name>小小娟</name><uri>http://www.cnblogs.com/jintianhu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jintianhu/archive/2011/09/23/2186664.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jintianhu/archive/2011/09/23/2186664.html"/><content type="html">&lt;div&gt;当编写WHERE语句中有LIKE条件时，如果参数中需要匹配 % 和_ 等特殊字符时，必须进行处理，否则系统会将其当成通配符处理。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;SqlServer：&lt;/div&gt;&lt;div&gt;有两种方案&lt;/div&gt;&lt;div&gt;一：将参数中的&amp;nbsp;[ 替换成 [[]，&amp;nbsp; % 替换成 [%]， _ 替换成 [_]；（推荐用这种方案处理）&lt;/div&gt;&lt;div&gt;二：先将参数中的&amp;nbsp;\ 替换成 \\，&amp;nbsp;[替换成\[ ， % 替换成 \%， _ 替换成 \_；&lt;div&gt;然后在每个需要like查询的字段后加上escape '\'。&lt;br /&gt;注：sqlserver2005测试通过&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Oracle只能既改参数，又改SQL语句。&lt;/div&gt;&lt;div&gt;先将参数中的&amp;nbsp;\ 替换成 \\，&amp;nbsp; % 替换成 \%， _ 替换成 \_；&lt;/div&gt;&lt;div&gt;然后在每个需要like查询的字段后加上escape &amp;nbsp; chr(92 &amp;nbsp; USING &amp;nbsp; NCHAR_CS)，组成的SQL语句形如：&lt;/div&gt;&lt;div&gt;select * from A where name like '%\%%' escape&amp;nbsp;chr(92&amp;nbsp;USING&amp;nbsp;NCHAR_CS) or addr like '%\_%' escape&amp;nbsp;chr(92&amp;nbsp;USING&amp;nbsp;NCHAR_CS);&lt;/div&gt;&lt;div&gt;在ORACLE 9I中必须写escape chr(92&amp;nbsp;USING&amp;nbsp;NCHAR_CS)这么长一段，ORACLE 10G中可以简写成escape '\'&lt;br /&gt;注：oracle9i、10g测试通过&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Mysql的情况与ORACLE类似，也需要用escape语句。但是经测试不能用escape '\'，所以用escape '/'&lt;br /&gt;先将参数中 / 替换成 //，% 替换成 /%，_&amp;nbsp;替换成 /_，\&amp;nbsp;替换成 /\；&lt;/div&gt;&lt;div&gt;然后在每个需要like查询的字段后加上escape '/'。&lt;br /&gt;注：Mysql 5.5测试通过&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Access不能用escape，但与SQLSERVER类似，只需将参数中的&amp;nbsp;[ 替换成 [[]，&amp;nbsp; % 替换成 [%]， _ 替换成 [_]即可。&lt;br /&gt;注：Access2003测试通过&lt;/div&gt;&lt;img src="http://www.cnblogs.com/jintianhu/aggbug/2186664.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jintianhu/archive/2011/09/23/2186664.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jintianhu/archive/2011/08/28/2156372.html</id><title type="text">浙江电信网上营业厅的一个BUG（有更新）</title><summary type="text">前几天看到浙江电信网上营业厅在搞签到得米粒的活动，每天可签到一次，每次获得一个米粒，首次签到可以获得21个米粒。我玩了几天，发现了它的一个BUG。我们先看看页面，地址是http://zj.ct10000.com/qiandao点击后就变灰了，当天就不能再次点了，如下图所示：先来看看页面代码吧，用开发人员工具很容易就找到下面这个JS方法注意红框的代码，它是根据前台传过去的参数来判断是否首次登陆。...</summary><published>2011-08-28T12:42:00Z</published><updated>2011-08-28T12:42:00Z</updated><author><name>小小娟</name><uri>http://www.cnblogs.com/jintianhu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jintianhu/archive/2011/08/28/2156372.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jintianhu/archive/2011/08/28/2156372.html"/><content type="html">&lt;p&gt;前几天看到浙江电信网上营业厅在搞签到得米粒的活动，每天可签到一次，每次获得一个米粒，首次签到可以获得21个米粒。&lt;br /&gt;我玩了几天，发现了它的一个BUG。我们先看看页面，地址是&lt;a href="http://zj.ct10000.com/qiandao"&gt;http://zj.ct10000.com/qiandao&lt;/a&gt;&lt;br /&gt;点击后就变灰了，当天就不能再次点了，如下图所示：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/42203/2011082820244298.jpg" /&gt;&lt;/p&gt;&lt;p&gt;先来看看页面代码吧，用开发人员工具很容易就找到下面这个JS方法&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/42203/2011082820270262.jpg" /&gt;&lt;/p&gt;&lt;p&gt;注意红框的代码，它是根据前台传过去的参数来判断是否首次登陆。那么如果我们每次都传&amp;ldquo;登陆首次积分&amp;rdquo;这个字符串过去呢？&lt;br /&gt;测试一下，先要登陆网上营业厅，然后在签到页面执行如下JS代码&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;$j.post('/zjpr/score/qiandao/checkin.html', {'type': 'WT_SIGNIN', 'name': encodeURI('登录首次积分')}, function(data){&lt;br/&gt;alert(data);&lt;br/&gt;});&lt;br/&gt;&lt;/div&gt;&lt;p&gt;接着查询一下米粒数量看看：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/42203/2011082820294516.jpg" /&gt;&lt;/p&gt;&lt;p&gt;果然是多了21个，说明它后台没做验证。这时如果再次执行就没效果了，因为后台做了同一天只能签到一次的验证。&lt;br /&gt;那么如果在还没签到的时候，同时执行多次上面的JS代码，会怎么样呢？试验一下，执行如下代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;for(var i=0;i&amp;lt;10;i++){&lt;br/&gt;$j.post('/zjpr/score/qiandao/checkin.html', {'type': 'WT_SIGNIN', 'name': encodeURI('登录首次积分')}, function(data){&lt;br/&gt;&lt;br/&gt;});&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;同时提交10个请求，看看后台是如何处理并发的。查询一下&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/42203/2011082820334656.jpg" /&gt;&lt;/p&gt;&lt;p&gt;存在了多条记录，米粒数从165涨到了249。说明后台没对代码加锁（C#中的lock，JAVA中的synchronized），导致存在并发问题。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：首先还是那句话，前台验证看需要，后台验证不可少；其次是建议对有特殊限制的操作的相应代码加锁，可以对session中的对&lt;br /&gt;象加锁，这样既限制了同一用户的并发操作，又不影响其它用户。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;续：刚才又找到一个漏洞，可以直接无限刷米粒。原理是这样，在签到页面有分享链接，可以分享到人人、开心等网站，分享一个&lt;br /&gt;获得一个米粒。但是后台没有对分享的名称做过滤，于是我传了一个随机数过去，也分享成功，获得了一个米粒。JS代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;$j.post(basePath+'zjpr/score/qiandao/checkin.html', {"type": "WT_SHARE", "channel": Math.random(), "name": encodeURI("分享渠道积分")}, function(data) {&lt;br/&gt;&lt;br/&gt;});&lt;br/&gt;&lt;/div&gt;&lt;p&gt;然后写个循环，你们懂得。我现在已经有1500多个米粒了&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/42203/2011082919231073.jpg" /&gt;&lt;/p&gt;&lt;p&gt;我已经把BUG报给在线客服了，能不能快速处理掉就看电信的办事效率了。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jintianhu/aggbug/2156372.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jintianhu/archive/2011/08/28/2156372.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jintianhu/archive/2011/07/20/2112027.html</id><title type="text">某投注网站的BUG</title><summary type="text">前两天一个博彩投注网站的站长，说是要找网站的漏洞，看不到源代码，只能通过前台测试。由于之前找过团购网站的漏洞（请看这里），因此便谈好一个漏洞500元。可惜天下老板一般黑啊，就是不给，现在QQ也隐身了。之前找出漏洞的团购网站（VC团）也一样，说好给报酬的也没下文了，就这点器量这点诚信，网站还能做大？手底下人能留的住？那VC团当时和我联系的开发人员，没几个月也离职了，可见一斑哪。 博彩投注网站一般不能随意注册，得找一个代理给你注册，当时那个站长给了一个测试账号。 以下是投注的页面 我们用IE8开发人员工具就能发现很多个hidden标签，连注释都有！该网站将需要的金额数通过javascript计算.</summary><published>2011-07-20T12:03:00Z</published><updated>2011-07-20T12:03:00Z</updated><author><name>小小娟</name><uri>http://www.cnblogs.com/jintianhu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jintianhu/archive/2011/07/20/2112027.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jintianhu/archive/2011/07/20/2112027.html"/><content type="html">&lt;p&gt;前两天一个博彩投注网站的站长，说是要找网站的漏洞，看不到源代码，只能通过前台测试。由于之前找过团购网站&lt;br /&gt;的漏洞（&lt;a href="http://www.cnblogs.com/jintianhu/archive/2011/01/03/1924989.html"&gt;请看这里&lt;/a&gt;），因此便谈好一个漏洞500元。可惜天下老板一般黑啊，就是不给，现在QQ也隐身了。之前找出漏&lt;br /&gt;洞的团购网站（VC团）也一样，说好给报酬的也没下文了，就这点器量这点诚信，网站还能做大？手底下人能留的住？那&lt;br /&gt;VC团当时和我联系的开发人员，没几个月也离职了，可见一斑哪。&lt;/p&gt;&lt;p&gt;博彩投注网站一般不能随意注册，得找一个代理给你注册，当时那个站长给了一个测试账号。&lt;/p&gt;&lt;p&gt;以下是投注的页面&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/42203/2011072019291679.jpg" /&gt;&lt;/p&gt;&lt;p&gt;我们用IE8开发人员工具就能发现很多个hidden标签，连注释都有！该网站将需要的金额数通过javascript计算出来后放在hidden标签中，&lt;br /&gt;提交给后台，但是后台却没有验证金额。这里我们将金额数修改为0.01，然后提交，投注成功！经测试，中奖后奖金确实会加到账户中！(这里&lt;br /&gt;如果修改期号，还能购买前面已经开过奖的期号，但是系统不会判断你中奖)&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/42203/2011072019342341.jpg" /&gt;&lt;/p&gt;&lt;p&gt;我们再进入已购买的订单的详情页面。&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/42203/2011072019374930.jpg" /&gt;&lt;/p&gt;&lt;p&gt;这里有个撤单按钮，先看看form表单的内容吧。&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://pic002.cnblogs.com/images/2011/42203/2011072019393796.jpg" /&gt;&lt;/p&gt;&lt;p&gt;看到没？这里有个单据编号，我们将它修改成其他单据号，点击撤单按钮，提示撤单成功，之前花费的0.01元也回来的，&lt;br /&gt;但是该详情页面进去，发现还能继续撤单，金额依旧会加上去，于是这样就能无限刷钱了！&lt;/p&gt;&lt;p&gt;还有个BUG是关于代理充值的。每个代理可以给下线充值，将自己账户上的钱转给下线。该页面地址形如addmoney.aspx?id=15234。&lt;br /&gt;将那个id换成别的id，就可以替别的代理为他的下线充值了！该网站的开发人员应该是意识到了一点安全性，整个网站是用iframe&lt;br /&gt;框架页做的，禁掉了鼠标右键、选择文字等功能，主框架里的页面如果直接打开就跳转到其他页面，等等一系列处理。可惜&lt;br /&gt;手握IE8开发人员工具足矣，直接修改iframe的src属性，便可以了！&lt;/p&gt;&lt;p&gt;最后一个BUG是，如果禁掉了javascript以未登录状态进入该网站，便不会跳转到登录页面（因为是用JS去跳转的），&lt;br /&gt;这时你的权限是代理，可以随意添加下线用户（不过账户金额都为0）。&lt;/p&gt;&lt;p&gt;说了那么多，还是那句话，客户端的东西靠不住！另外附上一句：遇到没诚信的老板的程序员，你们伤不起啊！！&lt;/p&gt;&lt;p&gt;附上该网站地址&lt;a href="http://dx1.txtxzz.com/trade/"&gt;http://dx1.txtxzz.com/trade/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jintianhu/aggbug/2112027.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jintianhu/archive/2011/07/20/2112027.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jintianhu/archive/2011/04/18/2019879.html</id><title type="text">ASP.NET自定义控件开发示例（二）</title><summary type="text">接着上次的内容。接下来我们让它的时间能不停走动。新建一个类TipTime3,新建脚本文件TipTime3.js，将TipTime2代码都复制过来。 为了能将C#的DateTime对象转换为JS的Date，需要将该时间距离1970-1-1午夜的毫秒数传给JS。剩下的工作就是利用setInterval每隔1秒改变span标签的文本，略过。 下一步要实现利用AJAX获取服务端的时间。先要让控件实现ICallbackEventHandler接口。该接口包含2个方法。 RaiseCallbackEvent用于处理客户端传递过来的参数，这里不需要，所以空着。 GetCallbackResult用于处理返回</summary><published>2011-04-18T07:13:00Z</published><updated>2011-04-18T07:13:00Z</updated><author><name>小小娟</name><uri>http://www.cnblogs.com/jintianhu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jintianhu/archive/2011/04/18/2019879.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jintianhu/archive/2011/04/18/2019879.html"/><content type="html">&lt;p&gt;接着上次的内容。接下来我们让它的时间能不停走动。新建一个类TipTime3,新建脚本文件TipTime3.js，将TipTime2代码都复制过来。 &lt;br /&gt;为了能将C#的DateTime对象转换为JS的Date，需要将该时间距离1970-1-1午夜的毫秒数传给JS。&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041813492748.png" /&gt;&lt;/p&gt;&lt;p&gt;剩下的工作就是利用setInterval每隔1秒改变span标签的文本，略过。 &lt;/p&gt;&lt;p&gt;下一步要实现利用AJAX获取服务端的时间。先要让控件实现ICallbackEventHandler接口。&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041813512481.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041813513263.png" /&gt;&lt;/p&gt;&lt;p&gt;该接口包含2个方法。 RaiseCallbackEvent用于处理客户端传递过来的参数，这里不需要，所以空着。 GetCallbackResult用于处理返回给客户端的数据，&lt;br /&gt;这里为了使效果明显，返回了一个随机时间。 &lt;br /&gt;注意要在OnLoad方法中需要加上这一行： &lt;br /&gt;Page.ClientScript.GetCallbackEventReference(this, "", "", "");&lt;br /&gt;这样做是为了保证页面上生成了WebForm_DoCallback方法。&lt;br /&gt;剩下的工作就是客户端去调用了。WebForm_DoCallback方法的参数说明依次为：&lt;br /&gt;需要回调的控件的UniqueID &lt;br /&gt;回调的参数 &lt;br /&gt;回调结束后客户端的响应事件 &lt;br /&gt;回调的上下文 &lt;br /&gt;回调出错后客户端的响应事件 &lt;br /&gt;是否异步 &lt;/p&gt;&lt;p&gt;接着给按钮添加onclick事件，调用WebForm_DoCallback方法，在回调结束后的响应事件中将结果显示在span标签上就行了。 &lt;br /&gt;这时我们发现如果页面回传了，控件的位置就会回到原来的位置，因此需要在每次拖动结束后将位置存储在&amp;lt;input type=&amp;ldquo;hidden&amp;rdquo;/&amp;gt;标签中。 &lt;br /&gt;新建一个类TipTime4,新建脚本文件TipTime4.js，将TipTime3代码都复制过来。 &lt;br /&gt;新建两个属性X,Y用来存储控件在客户端的坐标，并在RenderContents方法中输出一个Input标签，保证客户端的坐标信息在回传时还存在。 &lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041814444296.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041814445078.png" /&gt;&lt;/p&gt;&lt;p&gt;注意这里对属性X,Y没有用ViewState存储，是因为这2两个值是存在于表单数据中，这个与TextBox控件的Text属性类似。 &lt;br /&gt;对上面的input标签一定要设置name属性，不然是不会随着表单提交的。 &lt;br /&gt;为了能让在回传后获取input标签的值，需要让控件实现IPostBackDataHandler接口&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041814453095.png" /&gt;&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041814455390.png" /&gt;&lt;/p&gt;&lt;p&gt;LoadPostData方法用来检查提交给服务器的数据，根据控件状态数据和回发数据是否发生更改而判断是否调用RaisePostDataChangedEvent方法，&lt;br /&gt;如果返回true，则.NET Framework会自动调用RaisePostDataChangedEvent方法，在此方法中可以引发自己定义的事件。 &lt;br /&gt;这里只将回发数据存储到X,Y属性中。&lt;br /&gt;接下来要在OnLoad事件中加上 &lt;br /&gt;Page.RegisterRequiresPostBack(this);&lt;br /&gt;这是为了保证在回传时触发IPostBackDataHandler接口。&lt;br /&gt;然后在AddAttributesToRender方法中设置控件的left、right属性：&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041815115856.png" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;最后在JS中拖动结束时将控件的坐标存入input标签中即可。&lt;/p&gt;&lt;p&gt;最后要加的功能是到了一个时间，自动回传触发自定义事件。新建一个类TipTime,新建脚本文件TipTime.js&lt;br /&gt;将TipTime4代码都复制过来。先加一个属性，用来存储配置的定时时间：&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041814550998.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041814554064.png" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;接着定义自定义事件。这上面的写法都是固定的写法。这样在设计视图就能看到该事件了&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041814564448.png" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;然后实现IPostBackEventHandler接口&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041814571787.png" /&gt;&lt;/p&gt;&lt;p&gt;在条件成立时，就执行自定义事件。&lt;br /&gt;下一步在JS中判断是否到时间了，如果是则调用__doPostBack方法来实现回传，并将控件的UniqueID作为参数传递过去，&lt;br /&gt;这样服务端才能知道是哪个控件触发的回传事件。&lt;br /&gt;&amp;nbsp;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041814590574.png" /&gt;&lt;/p&gt;&lt;p&gt;需要注意的是必须在OnLoad方法中加上：&lt;br /&gt;Page.ClientScript.GetPostBackEventReference(new PostBackOptions(this));&lt;br /&gt;这样页面上才会有__doPostBack方法，并且才会触发IPostBackEventHandler接口。 &lt;br /&gt;至此，所有功能都实现了。&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; color: white; language: zh-CN; mso-bidi-font-family: +mn-cs; mso-font-kerning: 12.0pt; mso-ascii-font-family: Tahoma; mso-fareast-font-family: 宋体; mso-color-index: 1;"&gt;&lt;span color="#000000" face="Verdana" style="font-family: Verdana; color: #000000;"&gt;示例代码&lt;a href="http://files.cnblogs.com/jintianhu/HampControl.rar"&gt;下载&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.cnblogs.com/jintianhu/archive/2011/04/15/2017402.html"&gt;ASP.NET自定义控件开发示例（一）&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jintianhu/aggbug/2019879.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jintianhu/archive/2011/04/18/2019879.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jintianhu/archive/2011/04/15/2017402.html</id><title type="text">ASP.NET自定义控件开发示例（一）</title><summary type="text">本文通过实现一个服务端控件来讲解一下控件开发，该控件的功能如下：1.显示服务端时间，并不停更新 2.通过手动点击刷新按钮以AJAX获取服务端最新时间 3.能拖动 4.能记住在页面上的位置，页面回传后位置不变 5.能配置一个定时时间，一到这个时间，自动回传触发用户自定义的事件首先新建一个类库项目HampWebControl，再新建一个类叫TipTime1，继承WebControl类。如果不是从已有控件中继承，一般就继承WebControl类，它是所有ASP.NET服务端控件的基类。我们编译这个项目，再新建一个网站项目，引用HampWebControl项目，新建页面，在工具箱中拖一个TipTime</summary><published>2011-04-15T09:31:00Z</published><updated>2011-04-15T09:31:00Z</updated><author><name>小小娟</name><uri>http://www.cnblogs.com/jintianhu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jintianhu/archive/2011/04/15/2017402.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jintianhu/archive/2011/04/15/2017402.html"/><content type="html">&lt;p&gt;本文通过实现一个服务端控件来讲解一下控件开发，该控件的功能如下：&lt;br /&gt;1.显示服务端时间，并不停更新 &lt;br /&gt;2.通过手动点击刷新按钮以AJAX获取服务端最新时间 &lt;br /&gt;3.能拖动 &lt;br /&gt;4.能记住在页面上的位置，页面回传后位置不变 &lt;br /&gt;5.能配置一个定时时间，一到这个时间，自动回传触发用户自定义的事件&lt;/p&gt;&lt;p&gt;首先新建一个类库项目HampWebControl，再新建一个类叫TipTime1，继承WebControl类。如果不是从已有控件中继承，一般就继承WebControl类，&lt;br /&gt;它是所有ASP.NET服务端控件的基类。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041515450718.png" /&gt;&lt;/p&gt;&lt;p&gt;我们编译这个项目，再新建一个网站项目，引用HampWebControl项目，新建页面，在工具箱中拖一个TipTime1控件到页面上。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041515495944.png" /&gt;&lt;/p&gt;&lt;p&gt;我们运行该页面，就会发现HTML代码如下：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041515505991.png" /&gt;&lt;/p&gt;&lt;p&gt;就是说默认是呈现成一个span标签，可以通过重载WebControl基类的TagKey属性来改变。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041515520079.png" /&gt;&lt;/p&gt;&lt;p&gt;这样呈现在页面上就是个DIV。 HtmlTextWriterTag是个枚举，包含了很多HTML标签。 &lt;/p&gt;&lt;p&gt;WebControl基类的Render用来呈现内容，重载它便可以往页面上呈现任何自定义的标签。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041516091837.png" /&gt;&lt;/p&gt;&lt;p&gt;这样在页面上就显示了一个a标签，如下图所示：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041516100514.png" /&gt;&lt;/p&gt;&lt;p&gt;注意看，这时a标签是在DIV外面，如何将它放到DIV里面呢？这就要重载WebControl基类的RenderContents方法&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041516114994.png" /&gt;&lt;/p&gt;&lt;p&gt;这样这个a标签就在div里面了，如下图所示：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041516321722.png" /&gt;&lt;/p&gt;&lt;p&gt;接下来为最外围的DIV加一些样式，重载基类的AddAttributesToRender方法&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041516325538.png" /&gt;&lt;/p&gt;&lt;p&gt;这里有两种写法，利用HtmlTextWriterStyle枚举或者直接写CSS属性名。&lt;/p&gt;&lt;p&gt;到这里大家了解了自定义控件如何呈现在页面上。我们再新建一个类TipTime2，把依旧重载TagKey为DIV，然后重载RenderContents，&lt;br /&gt;显示一个span标签与一个input标签。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041516443886.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; color: white; mso-bidi-font-family: +mn-cs; mso-font-kerning: 12.0pt; mso-ascii-font-family: Tahoma; mso-fareast-font-family: 宋体; language: zh-CN; mso-color-index: 1;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: 宋体; color: white; mso-bidi-font-family: +mn-cs; mso-font-kerning: 12.0pt; mso-ascii-font-family: Tahoma; mso-fareast-font-family: 宋体; language: zh-CN; mso-color-index: 1;"&gt;&amp;nbsp;&lt;/span&gt;&lt;p&gt;这样页面上显示了当前服务端的时间与一个按钮，如图所示：&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041516454495.png" /&gt;&lt;br /&gt;接下来我们来让用户可以配置按钮上的文字，为类TipTime2增加一个Text属性：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041516470052.png" /&gt;&lt;/p&gt;&lt;p&gt;同时将呈现按钮的代码改成：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041516492031.png" /&gt;&lt;/p&gt;&lt;p&gt;这样Text属性便出现在设计视图的属性窗口。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041516501867.png" /&gt;&lt;/p&gt;&lt;p&gt;修改Text的值，页面上按钮上的文本也跟着变了。注意Text属性是存储在ViewState中，这样保证了回发后值不会丢失。&lt;br /&gt;现在的问题是时间不会变，我们得用javascript来改变它的值。新建一个JS文件TipTime2.js。&lt;br /&gt;这里先要说明的是，项目中已有一个JS文件__WebControlBase.js，里面是一些公用的JS方法，比如绑定事件、获取控件坐标等，所有的方法都是&lt;br /&gt;该方法的扩展方法：var HampWebControl=function(){ }&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;停止事件冒泡&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    HampWebControl.prototype.StopBubble &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(e) {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (e &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; e.stopPropagation) {&lt;br /&gt;            e.stopPropagation();&lt;br /&gt;        } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br /&gt;            window.event.cancelBubble &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样可以减少全局变量，尽可能避免与其它js代码的变量重名。我将每个控件作为HampWebControl方法的一个扩展方法存在，同时每个控件对&lt;br /&gt;应一个数组，用以存储页面上所有该控件的js对象。每个控件对应一个Refresh方法，用以重新绑定事件，这是为了解决回传后的问题。 &lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041517114445.png" /&gt;&lt;br /&gt;现在控件呈现成HTML的结构是&amp;lt;div&amp;gt;&amp;lt;span/&amp;gt;&amp;lt;input/&amp;gt;&amp;lt;/div&amp;gt;，有3个标签，我们需要用3个变量来分别存储它们的DOM对象，方便以后操作。 &lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041517111040.png" /&gt;&lt;/p&gt;&lt;p&gt;后台对HTML标签命名时以当前控件的ClientID开头，后面根据需要加后缀，这样可以一定程度上防止标签重名。由后台将控件的ClientID传过来，&lt;br /&gt;这样便可以获取所有DOM对象。拖动效果利用的是现成js方法，属于纯javascript效果，这里就不展开讨论了，有兴趣的童鞋可以查看示例项目源码。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041517142498.png" /&gt;&lt;/p&gt;&lt;p&gt;该方法是由后台注册脚本来调用的，如果在数组中已存在就取该对象，否则重新new一个。并调用初始化与绑定事件方法。 &lt;br /&gt;这时需要在后台注册该js文件才行。关键的操作时将该文件的&amp;ldquo;生成操作&amp;rdquo;属性设置为&amp;ldquo;嵌入的资源&amp;rdquo;，使得编译的时候该js文件会作为DLL文件的一部分。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041517151668.png" /&gt;&lt;/p&gt;&lt;p&gt;接下来需要声明所需的资源文件，严格按文件夹的结构来命名。这里注册了2个JS文件：公用JS文件__WebControlBase.js与控件专用的JS文件TipTime2.js。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041517172268.png" /&gt;&lt;/p&gt;&lt;p&gt;然后在代码中注册脚本即可。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041517205775.png" /&gt;&lt;/p&gt;&lt;p&gt;在《道不远人 深入解析ASP.NET2.0控件开发》这本书中，注册脚本文件的代码是放在OnPreRender方法中，但是实际应用中我发现，如果将自定义&lt;br /&gt;控件放在UpdatePanel控件中，就会引发一些问题，所以我都放在OnLoad方法中去注册脚本文件。&lt;br /&gt;注意注册脚本文件这里用了2种不同的方法。 &lt;br /&gt;第1种是循环Head标签里面是否存在了脚本，如果不存在，就插入一个&amp;lt;script&amp;gt;标签。 &lt;br /&gt;第2种直接调用.NET的注册方法。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 向页面注册公共jacascript文件&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="control"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;控件对象&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RegisterCommonJSFile(Control control)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;注册jacascript文件&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            String jslink &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;lt;script src='&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                          control.Page.ClientScript.GetWebResourceUrl(control.GetType(),&lt;br /&gt;                          &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;HampWebControl.includes.__WebControlBase.js&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                          &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;' type='text/javascript' &amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            Register(jslink,control);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 注册资源&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="strLink"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;资源字符串&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Register(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; strLink, Control control) &lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;为了保证资源只注册一次,循环比较,已存在了就不添加&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            Boolean flag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Int32 i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; control.Page.Header.Controls.Count; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            {&lt;br /&gt;                LiteralControl lc &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; control.Page.Header.Controls[i] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; LiteralControl;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (lc &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (lc.Text &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; strLink)&lt;br /&gt;                    {&lt;br /&gt;                        flag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;flag)&lt;br /&gt;            {&lt;br /&gt;                LiteralControl include &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; LiteralControl(strLink);&lt;br /&gt;                control.Page.Header.Controls.Add(include);&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;第1种是用于注册公用的资源文件，第2种用于注册该控件特有的资源文件。 因为第2种方法只能保证多个该控件对象只注册一个脚本，但不能保证其它控件也 &lt;br /&gt;重复注册了该脚本，所以为了保证公用的资源文件只注册一次，就用第1种方式。&lt;br /&gt;下一步就是注册要执行的脚本代码：&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041517270820.png" /&gt;&lt;/p&gt;&lt;p&gt;这里如果控件是隐藏的，就不注册。其实如果控件时放在其它容器控件中，比如Panel，而父容器控件设置为隐藏，那么该控件也不可见，但是依旧执行了注册上面的脚本的 &lt;br /&gt;代码，所以要在前台Init方法中去判断相应的DOM对象是否存在，这里就没有多做判断。 &lt;br /&gt;最后设置一下样式，使之变为浮动，则控件在页面上便能拖动了。&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011041517275951.png" /&gt;&lt;/p&gt;&lt;p&gt;先讲到这里，归纳一下，主要讲了如何呈现自定义控件，如何添加属性，如何增加资源文件。下一讲介绍如何调用AJAX与实现自定义事件。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jintianhu/aggbug/2017402.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jintianhu/archive/2011/04/15/2017402.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jintianhu/archive/2011/02/18/1957487.html</id><title type="text">Silverlight与Flash在FF中的一些注意点</title><summary type="text">在HTML中，Silverlight、Flash以object标签的形式显示，如以下代码：View Code 但是必须同时指定该object元素的height、width的值，否则在FF下不能显示。同时如果height的值为百分比，则它的外围元素必须有高度，否则也不显示(width的值为百分比的情况也一样)如下代码在FF下不能显示：View Code 如下代码在FF下可以显示（因为div默认宽度就是整个屏幕的宽度）：View Code 另一个注意点也是在FF下，当把object元素用style.display=”none”的形式隐藏掉，再用style.display=&amp;</summary><published>2011-02-18T09:25:00Z</published><updated>2011-02-18T09:25:00Z</updated><author><name>小小娟</name><uri>http://www.cnblogs.com/jintianhu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jintianhu/archive/2011/02/18/1957487.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jintianhu/archive/2011/02/18/1957487.html"/><content type="html">&lt;div id="divSilverlight"&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;在HTML中，Silverlight、Flash以object标签的形式显示，如以下代码：&lt;/div&gt;&lt;div&gt;&lt;div onclick="cnblogs_code_show('2f4e72fa-5326-41a3-bf81-1d57f849ccfe')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_2f4e72fa-5326-41a3-bf81-1d57f849ccfe" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" onclick="cnblogs_code_hide('2f4e72fa-5326-41a3-bf81-1d57f849ccfe',event)" class="code_img_opened" id="code_img_opened_2f4e72fa-5326-41a3-bf81-1d57f849ccfe" style="display: none;" /&gt;&lt;div class="cnblogs_code_hide" id="cnblogs_code_open_2f4e72fa-5326-41a3-bf81-1d57f849ccfe"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;object &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;data&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="data:application/x-silverlight-2,"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="application/x-silverlight-2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;object&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p align="left"&gt;但是必须同时指定该object元素的height、width的值，否则在FF下不能显示。&lt;/p&gt;&lt;p align="left"&gt;同时如果height的值为百分比，则它的外围元素必须有高度，否则也不显示(width的值为百分比的情况也一样)&lt;/p&gt;&lt;p&gt;如下代码在FF下不能显示：&lt;/p&gt;&lt;div onclick="cnblogs_code_show('ffb3e4f0-f5bd-4c33-84fd-9e78cb10a4e0')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_ffb3e4f0-f5bd-4c33-84fd-9e78cb10a4e0" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" onclick="cnblogs_code_hide('ffb3e4f0-f5bd-4c33-84fd-9e78cb10a4e0',event)" class="code_img_opened" id="code_img_opened_ffb3e4f0-f5bd-4c33-84fd-9e78cb10a4e0" style="display: none;" /&gt;&lt;div class="cnblogs_code_hide" id="cnblogs_code_open_ffb3e4f0-f5bd-4c33-84fd-9e78cb10a4e0"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="width:200px;"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;object &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;data&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="data:application/x-silverlight-2,"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="application/x-silverlight-2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;=" height:100%;width:100%"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;object&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;如下代码在FF下可以显示（因为div默认宽度就是整个屏幕的宽度）：&lt;/p&gt;&lt;div onclick="cnblogs_code_show('b66fe63b-bc16-42f1-8901-77866df473c4')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_b66fe63b-bc16-42f1-8901-77866df473c4" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" onclick="cnblogs_code_hide('b66fe63b-bc16-42f1-8901-77866df473c4',event)" class="code_img_opened" id="code_img_opened_b66fe63b-bc16-42f1-8901-77866df473c4" style="display: none;" /&gt;&lt;div class="cnblogs_code_hide" id="cnblogs_code_open_b66fe63b-bc16-42f1-8901-77866df473c4"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="height:200px;"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;object &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;data&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="data:application/x-silverlight-2,"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="application/x-silverlight-2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;=" height:100%;width:100%"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;object&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;另一个注意点也是在FF下，当把object元素用style.display=&amp;rdquo;none&amp;rdquo;的形式隐藏掉，再用style.display=&amp;rdquo;&amp;rdquo;显示出来的时候，Silverlight、&lt;/p&gt;&lt;p&gt;Flash会重新加载，之前代码中的一些属性字段也都没了。（隐藏掉外围元素也是一样，即object外面有个div，隐藏div再显示一样触发重新加载）&lt;/p&gt;&lt;p&gt;另外，改变该object元素的style.position值，几乎都会让Silverlight、Flash重新加载，比如从static到absolute,从static到relative, &lt;/p&gt;&lt;p&gt;absolute到relative等等。将该object元素移动到别的DOM对象下面也会触发重新加载，比如document.body.appendChild(obj)。&lt;/p&gt;&lt;p&gt;以Silverlight为例：&lt;/p&gt;Silverlight的App代码中，在Application启动的时候，弹出一个提示框：&lt;div onclick="cnblogs_code_show('2758f210-963f-48cd-9207-5ffb4c9e6c02')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_2758f210-963f-48cd-9207-5ffb4c9e6c02" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" onclick="cnblogs_code_hide('2758f210-963f-48cd-9207-5ffb4c9e6c02',event)" class="code_img_opened" id="code_img_opened_2758f210-963f-48cd-9207-5ffb4c9e6c02" style="display: none;" /&gt;&lt;div class="cnblogs_code_hide" id="cnblogs_code_open_2758f210-963f-48cd-9207-5ffb4c9e6c02"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Application_Startup(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, StartupEventArgs e)&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.RootVisual &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MainPage();&lt;br /&gt;    MessageBox.Show(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;启动&amp;rdquo;);&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;页面代码：&lt;/p&gt;&lt;div onclick="cnblogs_code_show('3fdc92e1-da9a-4b97-9e67-cfd53e0c0fc4')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_3fdc92e1-da9a-4b97-9e67-cfd53e0c0fc4" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" onclick="cnblogs_code_hide('3fdc92e1-da9a-4b97-9e67-cfd53e0c0fc4',event)" class="code_img_opened" id="code_img_opened_3fdc92e1-da9a-4b97-9e67-cfd53e0c0fc4" style="display: none;" /&gt;&lt;div class="cnblogs_code_hide" id="cnblogs_code_open_3fdc92e1-da9a-4b97-9e67-cfd53e0c0fc4"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;object &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="obj"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; data&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="data:application/x-silverlight-2,"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="application/x-silverlight-2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;=" height:110px;width:110px;"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;param &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="source"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="ClientBin/Test.xap"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;param &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="background"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="white"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;param &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="minRuntimeVersion"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="3.0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;param &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="autoUpgrade"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="true"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;object&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="隐藏?"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; onclick&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="obj.style.display='none'"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="显示"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; onclick&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="obj.style.display='block'"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;select &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Select1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="inherit"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;option &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="inherit"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;inherit&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;option&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;option &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="absolute"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;absolute&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;option&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;option &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fixed"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;fixed&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;option&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;option &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="relative"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;relative&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;option&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;option &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="static"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;static&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;option&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="设置position"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; onclick&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="obj.style.position=Select1.value"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; obj &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; document.getElementById(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;obj&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);&lt;br /&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; Select1 &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; document.getElementById(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;Select1&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这样由于在FF中诡异的重新加载问题，如果实际应用中确实要隐藏掉object元素，可以设置style.visibility=&amp;rdquo;hidden&amp;rdquo;,虽然这样该元素还&lt;/p&gt;&lt;p&gt;是在页面上占着位置。目前还没找到完美的解决方案。&lt;span id="mce_marker"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br&gt;&lt;object id="obj" data="data:application/x-silverlight-2," type="application/x-silverlight-2" style=" height:110px;width:110px; position:absolute"&gt;  &lt;param name="source" value="http://files.cnblogs.com/jintianhu/Test.xap"/&gt;  &lt;param name="background" value="white" /&gt;  &lt;param name="minRuntimeVersion" value="3.0" /&gt;  &lt;param name="autoUpgrade" value="true" /&gt;    &lt;/object&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;input type="button" value="隐藏" onclick="obj.style.display='none'"/&gt;    &lt;input type="button" value="显示" onclick="obj.style.display='block'"/&gt;    &lt;br /&gt;    &lt;select id="Select1" value="inherit"&gt;        &lt;option value="inherit"&gt;inherit&lt;/option&gt;        &lt;option value="absolute"&gt;absolute&lt;/option&gt;        &lt;option value="fixed"&gt;fixed&lt;/option&gt;        &lt;option value="relative"&gt;relative&lt;/option&gt;        &lt;option value="static"&gt;static&lt;/option&gt;    &lt;/select&gt;    &lt;input type="button" value="设置position" onclick="obj.style.position=Select1.value"/&gt;&lt;script type="text/javascript"&gt;    var obj = document.getElementById('obj');    var Select1 = document.getElementById('Select1');&lt;/script&gt;&lt;p align="left" class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-layout-grid-align: none; mso-line-height-alt: 0pt;"&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jintianhu/aggbug/1957487.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jintianhu/archive/2011/02/18/1957487.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jintianhu/archive/2011/02/16/1956337.html</id><title type="text">基于silverlight实现批量上传控件（一）</title><summary type="text">这是最近做的一个基于silverlight的ASP.NET批量上传控件，目前在写开发文档，同步将文档内容发在博客里。开发目的HTML的file控件只能选择单个文件，不能批量选择，而且没有进度提示。原理用silverlight实现多选批量上传，利用与javascript的交互来控制显示，并将其封装成ASP.NET服务端控件。总体结构首先用户进入页面，执行批量上传控件的服务端代码，生成HTML代码（包括silverlight的html代码，这样就完成了对silverlight的初始化）。用户在silverlight上选择完文件，开始上传，这时用silverlight去访问当前页面，在地址上加上标示</summary><published>2011-02-16T10:17:00Z</published><updated>2011-02-16T10:17:00Z</updated><author><name>小小娟</name><uri>http://www.cnblogs.com/jintianhu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jintianhu/archive/2011/02/16/1956337.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jintianhu/archive/2011/02/16/1956337.html"/><content type="html">这是最近做的一个基于silverlight的ASP.NET批量上传控件，目前在写开发文档，同步将文档内容发在博客里。&lt;br /&gt;&lt;b&gt;开发目的&lt;/b&gt;&lt;br /&gt;HTML的file控件只能选择单个文件，不能批量选择，而且没有进度提示。&lt;br /&gt;&lt;b&gt;原理&lt;/b&gt;&lt;br /&gt;用silverlight实现多选批量上传，利用与javascript的交互来控制显示，并将其封装成ASP.NET服务端控件。&lt;br /&gt;总体结构&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011021618044515.jpg" /&gt;&lt;br /&gt;首先用户进入页面，执行批量上传控件的服务端代码，生成HTML代码（包括silverlight的html代码，这样就完成了&lt;br /&gt;对silverlight的初始化）。用户在silverlight上选择完文件，开始上传，这时用silverlight去访问当前页面，在地址&lt;br /&gt;上加上标示变量，来告诉服务端这是一个上传请求；在批量上传控件的服务端判断是否上传请求，如果是则进行文&lt;br /&gt;件操作，完成后显示上传结果（成功或者出现异常），silverlight端获取后决定下一步动作（传输当前文件的剩余部&lt;br /&gt;分、传输下一个文件、传输结束等动作），同时调用javascript方法更新页面的显示信息，同时也可调用javascript&lt;br /&gt;方法来postback回传触发服务端事件。&lt;br /&gt;&lt;b&gt;界面&lt;/b&gt;&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42203/2011021618060968.jpg" /&gt;&lt;br /&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;控件最开始只会显示一个&amp;ldquo;上传&amp;rdquo;按钮，点击后显示浮动层，点击&amp;ldquo;选择文件&amp;rdquo;后弹出文件选择框，支持多选，选择完&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;毕点击&amp;ldquo;上传文件&amp;rdquo;进行上传，上传完毕后点击&amp;ldquo;确定&amp;rdquo;进行回传。&lt;/span&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;b style="mso-bidi-font-weight: normal;"&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;Silverlight&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight: normal;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;端的实现&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;Silverlight&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;在&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;HTML&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;显示其实就是一个&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;&amp;lt;object&amp;gt;&amp;lt;/object&amp;gt;,&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;结构类似：&lt;/span&gt;&lt;/p&gt;&lt;p align="left" class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"&gt;&lt;span lang="EN-US" style="font-family: 新宋体; color: #a31515; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&amp;lt;object id='obj' data='data:application/x-silverlight-2,' type='application/x-silverlight-2' &amp;gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 新宋体; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left" class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"&gt;&lt;span lang="EN-US" style="font-family: 新宋体; color: #a31515; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&amp;lt;param name='source'value='abc.xap' /&amp;gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 新宋体; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left" class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"&gt;&lt;span lang="EN-US" style="font-family: 新宋体; color: #a31515; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&amp;lt;param name='background' value='white' /&amp;gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 新宋体; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left" class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"&gt;&lt;span lang="EN-US" style="font-family: 新宋体; color: #a31515; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&amp;lt;param name='minRuntimeVersion' value='3.0' /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left" class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"&gt;&lt;span lang="EN-US" style="font-family: 新宋体; color: #a31515; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&amp;lt;param name='autoUpgrade' value='false' /&amp;gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 新宋体; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left" class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"&gt;&lt;span lang="EN-US" style="font-family: 新宋体; color: #a31515; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&amp;lt;param name='windowless' value='true'/&amp;gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 新宋体; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left" class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"&gt;&lt;span lang="EN-US" style="font-family: 新宋体; color: #a31515; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&amp;lt;param name='InitParams' value='a=1,b=2' /&amp;gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 新宋体; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span lang="EN-US" style="font-family: 新宋体; color: #a31515; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&amp;lt;/object&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;其中&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;source&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;表示&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;silverlight&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;编译生成的&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;xap&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;文件的路径；&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;minRuntimeVersion&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;表示客户端的&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;silverlight&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;最低运行版本，这里设置成&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;版本&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;3.0&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;，低于&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;3.0&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;的均不能正常运行该批量上传控件；&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;autoUpgrade&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;表示是否打开自动更新，这里关闭自动更新；&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 宋体; color: black; font-size: 12pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;"&gt;windowless&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;表示是否可以由其它&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;HTML&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;元素遮住&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;silverlight&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;，这里设置成可以被遮住；&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 宋体; color: black; font-size: 12pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;"&gt;InitParams&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;表示自定义参数，可以有多个，以逗&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;号隔开，该控件中用到的参数有：&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;ClientID&lt;/span&gt;&lt;span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;：批量上传控件的由&lt;span lang="EN-US"&gt; ASP.NET &lt;/span&gt;生成的服务器控件标识符，用于唯一标识用。&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;Filter&lt;/span&gt;&lt;span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;：文件名筛选器字符串，形如&lt;span lang="EN-US"&gt;"&lt;/span&gt;图片文件&lt;span lang="EN-US"&gt; (*.gif;*.jpg)|*.gif;*.jpg"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;FileMaxCount&lt;/span&gt;&lt;span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;：最大能上传的文件个数，为空表示不限&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;FileMaxLength&lt;/span&gt;&lt;span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;：单个文件最大长度，单位字节，为空表示不限&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;ShowSubmit&lt;/span&gt;&lt;span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;：是否显示&amp;ldquo;确定&amp;rdquo;按钮&lt;span lang="EN-US"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;DataPacketSize&lt;/span&gt;&lt;span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;：上传时每次发送的数据包大小，单位&lt;span lang="EN-US"&gt;KB&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="EN-US" style="font-family: 新宋体; font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-no-proof: yes;"&gt;SubDirectoryName&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-no-proof: yes;"&gt;：上传的文件在临时文件夹中存储时，所在的子文件夹名&lt;/span&gt;&lt;br /&gt;&lt;span lang="EN-US" style="font-family: 新宋体; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span lang="EN-US" style="font-family: 新宋体; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;Xaml&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;文件比较简单，如下所示：&lt;span lang="EN-US"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: #a31515; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;Grid&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Width&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="240"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Background&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="#f0f8f0"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; LayoutUpdated&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="Grid_LayoutUpdated"&amp;gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: #a31515; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: #a31515; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;Button&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Content&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="&lt;/span&gt;&lt;span style="font-family: 宋体; color: blue; font-size: 9pt; mso-ascii-font-family: NSimSun; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: NSimSun; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;选择文件&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Height&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="23"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="Left"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; x&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;:&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;Name&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="btnChoose"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; FontFamily&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="Arial,SimSun"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;FontSize&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="12"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; VerticalAlignment&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="Top"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Width&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="75"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Margin&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="2,3,0,0"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Click&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="btnChoose_Click" /&amp;gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: #a31515; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: #a31515; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;Button&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Content&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="&lt;/span&gt;&lt;span style="font-family: 宋体; color: blue; font-size: 9pt; mso-ascii-font-family: NSimSun; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: NSimSun; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;上传文件&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Height&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="23"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="Left"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; x&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;:&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;Name&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="btnUpload"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; FontFamily&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="Arial,SimSun"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;FontSize&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="12"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; VerticalAlignment&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="Top"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Width&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="75"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Margin&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="83,3,0,0"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Click&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="btnUpload_Click"/&amp;gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: #a31515; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: #a31515; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;Button&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Content&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="&lt;/span&gt;&lt;span style="font-family: 宋体; color: blue; font-size: 9pt; mso-ascii-font-family: NSimSun; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: NSimSun; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;确&lt;/span&gt;&lt;span style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; &lt;/span&gt;&lt;span style="font-family: 宋体; color: blue; font-size: 9pt; mso-ascii-font-family: NSimSun; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: NSimSun; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;定&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Height&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="23"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="Left"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; x&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;:&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;Name&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="btnOK"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; FontFamily&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="Arial,SimSun"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;FontSize&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="12"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; VerticalAlignment&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="Top"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Width&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="75"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Margin&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="164,3,0,0"&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: red; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt; Click&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;="btnOK_Click"/&amp;gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: #a31515; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: #a31515; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;Grid&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 9pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&amp;gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: blue; font-size: 11pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 新宋体; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-no-proof: yes;"&gt;就是三个按钮，分别为&amp;ldquo;选择文件&amp;rdquo;&amp;ldquo;上传文件&amp;rdquo;&amp;ldquo;确定&amp;rdquo;。&lt;/span&gt;&lt;p&gt;&lt;span style="font-family: 新宋体; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;接下来看着几个辅助类：&lt;span lang="EN-US"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 新宋体; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes;"&gt;枚举&lt;/span&gt;&lt;span lang="EN-US" style="font-family: NSimSun; color: #2b91af; font-size: 11pt; mso-bidi-font-family: NSimSun; mso-font-kerning: 0pt;"&gt;FileStatus&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 11.0pt; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 11.0pt; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"&gt;这个没什么好说的，就是文件状态的枚举。&lt;/span&gt;&lt;/p&gt;&lt;div onclick="cnblogs_code_show('817723c1-a924-426d-b3e7-a1853b8d63b6')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_817723c1-a924-426d-b3e7-a1853b8d63b6" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" onclick="cnblogs_code_hide('817723c1-a924-426d-b3e7-a1853b8d63b6',event)" class="code_img_opened" id="code_img_opened_817723c1-a924-426d-b3e7-a1853b8d63b6" style="display: none;" /&gt;&lt;div class="cnblogs_code_hide" id="cnblogs_code_open_817723c1-a924-426d-b3e7-a1853b8d63b6"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 文件的状态&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;enum&lt;/span&gt;&lt;span style="color: #000000;"&gt; FileStatus&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 准备就绪，等待上传&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        Ready &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 正在上传中&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        Uploading &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 上传成功&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        Success &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 上传中出现异常&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        Error &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 上传操作被用户中止&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        Cancel &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 已被用户删除&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        Delete &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 11.0pt; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"&gt;（未完待续。。。）&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 新宋体; font-size: 11pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-no-proof: yes;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jintianhu/aggbug/1956337.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jintianhu/archive/2011/02/16/1956337.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jintianhu/archive/2011/02/16/1952833.html</id><title type="text">Response.End导致“正在中止线程”异常的问题</title><summary type="text">这是最近发现的一个问题，我用AJAX请求P页面，然后根据返回值来确定下一步的逻辑，结果发现Response.End语句居然引发了“正在中止线程”异常，导致影响了判断返回结果的逻辑。P页面代码类似如下结构：[代码]根据一些业务逻辑返回相应的状态字符串，如果出现异常做返回“error”，我预期它返回“状态1”，结果测试时发现AJAX回调的结果是“状态1error”，它居然抛出异常了！google后得知：Response.End 方法终止页的执行，并将此执行切换到应用程序的事件管线中的 Applicati</summary><published>2011-02-16T07:50:00Z</published><updated>2011-02-16T07:50:00Z</updated><author><name>小小娟</name><uri>http://www.cnblogs.com/jintianhu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jintianhu/archive/2011/02/16/1952833.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jintianhu/archive/2011/02/16/1952833.html"/><content type="html">&lt;p&gt;这是最近发现的一个问题，我用AJAX请求P页面，然后根据返回值来确定下一步的逻辑，结果发现Response.End&lt;/p&gt;&lt;p&gt;语句居然引发了&amp;ldquo;正在中止线程&amp;rdquo;异常，导致影响了判断返回结果的逻辑。P页面代码类似如下结构：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;读取数据库&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这里对读出来的值进行业务逻辑判断&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            {&lt;br /&gt;                Response.Write(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;状态1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                Response.End();&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;读取数据库&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这里对读出来的值进行业务逻辑判断&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                {&lt;br /&gt;                    Response.Write(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;状态2&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                    Response.End();&lt;br /&gt;                }&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;                {&lt;br /&gt;                    Response.Write(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;状态3&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                    Response.End();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;        }&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;(Exception ex)&lt;br /&gt;        {&lt;br /&gt;            Response.Write(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"error&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;            Response.End();&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;根据一些业务逻辑返回相应的状态字符串，如果出现异常做返回&amp;ldquo;error&amp;rdquo;，我预期它返回&amp;ldquo;状态1&amp;rdquo;，结果测试时发现&lt;/p&gt;&lt;p&gt;AJAX回调的结果是&amp;ldquo;状态1error&amp;rdquo;，它居然抛出异常了！&lt;/p&gt;&lt;p&gt;google后得知：Response.End 方法终止页的执行，并将此执行切换到应用程序的事件管线中的 &lt;/p&gt;&lt;p&gt;Application_EndRequest 事件,同时抛出ThreadAbortException 异常，异常信息为&amp;ldquo;正在中止线程&amp;rdquo;。另外&lt;/p&gt;&lt;p&gt;Response.Redirect、Server.Transfer方法也会出现这个问题，因为它们内部调用了Response.End 方法。&lt;/p&gt;&lt;p&gt;它给出的解决方案是使用HttpContext.Current.ApplicationInstance.CompleteRequest 方法以跳过 &lt;/p&gt;&lt;p&gt;Application_EndRequest 事件的代码执行，但是我试了后发现虽然不抛出异常了，但是页面后面的代码依然会执行，&lt;/p&gt;&lt;p&gt;达不到Response.End的效果。&lt;/p&gt;&lt;p&gt;我目前的解决方案是将Response.End放到finally语句中，类似如下代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;读取数据库            &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这里对读出来的值进行业务逻辑判断            &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            {&lt;br /&gt;                Response.Write(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;状态1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;读取数据库                &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这里对读出来的值进行业务逻辑判断                &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                {&lt;br /&gt;                    Response.Write(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;状态2&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                }&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                {&lt;br /&gt;                    Response.Write(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;状态3&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;); &lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Exception ex)&lt;br /&gt;        {&lt;br /&gt;            Response.Write(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;error&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;finally&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;        {&lt;br /&gt;            Response.End();&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/jintianhu/aggbug/1952833.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jintianhu/archive/2011/02/16/1952833.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jintianhu/archive/2011/02/12/1952577.html</id><title type="text">URL地址中的#符号</title><summary type="text">一般我们想让一个a标签点击后执行javascript代码，有以下几种写法：方式一：&lt;a href="#" onclick="alert(1);"&gt;点击一&lt;/a&gt;这种方式的缺点就是点击后会在地址栏的URL后面加#号，同时把页面移动到顶部，如下图所示：方式二：&lt;a href="javascript:void(0);" onclick="alert(1);"&gt;点击一&lt;/a&gt;这种方式避免了方式一的缺点，点击后对页面没有任何影响。但是有一个致命的缺点，就是在IE6下不能执行form对象的submit()方法，也不能执行跳转语句，比如&lt;a href="</summary><published>2011-02-12T08:08:00Z</published><updated>2011-02-12T08:08:00Z</updated><author><name>小小娟</name><uri>http://www.cnblogs.com/jintianhu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jintianhu/archive/2011/02/12/1952577.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jintianhu/archive/2011/02/12/1952577.html"/><content type="html">&lt;p&gt;一般我们想让一个a标签点击后执行javascript代码，有以下几种写法：&lt;br /&gt;&lt;strong&gt;方式一&lt;/strong&gt;：&amp;lt;a href="#" onclick="alert(1);"&amp;gt;点击一&amp;lt;/a&amp;gt;&lt;br /&gt;这种方式的缺点就是点击后会在地址栏的URL后面加#号，同时把页面移动到顶部，如下图所示：&lt;br /&gt;&lt;img height="344" width="439" src="http://pic002.cnblogs.com/images/2011/42203/2011021216034672.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img height="370" width="440" src="http://pic002.cnblogs.com/images/2011/42203/2011021216052567.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;方式二&lt;/strong&gt;：&amp;lt;a href="javascript:void(0);" onclick="alert(1);"&amp;gt;点击一&amp;lt;/a&amp;gt;&lt;br /&gt;这种方式避免了方式一的缺点，点击后对页面没有任何影响。但是有一个致命的缺点，就是在IE6下不能执行form对象的submit()方法，也不能执行跳转语句，比如&lt;br /&gt;&amp;lt;a href="javascript:void(0);" onclick="document.forms[0].submit();"&amp;gt;点击一&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;a href="javascript:void(0);"&amp;nbsp; onclick="window.location.href='http://www.google.com';"&amp;gt;点击一&amp;lt;/a&amp;gt;&lt;br /&gt;在IE6下就无效，换成href=&amp;rdquo;#&amp;rdquo;就能在IE6下正常执行。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;方式三&lt;/strong&gt;：&amp;lt;a href="###" onclick="alert(1);"&amp;gt;点击一&amp;lt;/a&amp;gt;&lt;br /&gt;点击后虽然会在地址栏的URL后面加三个#号，但是不会影响滚动条，同时在IE6下也能执行form对象的submit()方法与跳转语句，算是一个比较折中的方法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方式四&lt;/strong&gt;：&amp;lt;a href="javascript:alert(1);"&amp;gt;点击一&amp;lt;/a&amp;gt;&lt;br /&gt;点击后不会影响滚动条,也不会在地址栏的URL后面加三个#号，同时在IE6下也能执行form对象的submit()方法与跳转语句；但是这样写最大的缺点是，JS方法都在&lt;/p&gt;&lt;p&gt;鼠标点击事件之中，写法不灵活，无法使用其它事件，限制了使用范围，也不方便动态对标签绑定事件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：我个人认为如果执行的javascript方法中需要提交表单、跳转页面，则用方式三，其它情况都用方式二。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;另&lt;/strong&gt;&lt;/span&gt;：这又附带引出另一个问题，一般重新加载当前页面用如下的javascript代码：&lt;br /&gt;window.location.href = window.location.href;&lt;br /&gt;但是当URL地址中含有#时，上述代码无效，于是需要用如下代码：&lt;br /&gt;window.location.href = window.location.href.split('#')[0];&lt;br /&gt;将URL地址以#符号分割开，取第一部分即可。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jintianhu/aggbug/1952577.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jintianhu/archive/2011/02/12/1952577.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
