<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Mike的技术博客</title><subtitle type="text">好好学习，天天向上。</subtitle><id>http://feed.cnblogs.com/blog/u/16277/rss</id><updated>2012-05-13T09:40:29Z</updated><author><name>mikelij</name><uri>http://www.cnblogs.com/mikelij/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mikelij/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/16277/rss"/><entry><id>http://www.cnblogs.com/mikelij/archive/2012/05/13/2496768.html</id><title type="text">别总以为asp.net mvc比asp.net web form好--web form的页面也可以体积小巧</title><summary type="text">最近才看到网上有一种对asp.net web form的误解。也有很多讨论，弄得微软ScottGu也来澄清。asp.net mvc和web form是并行存在的两种开发模式。许多人对web form的诟病很多，其中最主要的就是说viewstate，随便一个web form页面，其html源码就体积很大，主要是隐藏字段viewstate体积比较大，至少几十K，页面复杂一点，viewstate的大小能上几兆，这样大体积的页面，在浏览器和服务器之间传输，对网络带宽也是一个很大的压力，所以asp.net webform的性能肯定受很大影响。这其实是一个对asp.net web form的特大误解。这里</summary><published>2012-05-13T09:35:00Z</published><updated>2012-05-13T09:35:00Z</updated><author><name>mikelij</name><uri>http://www.cnblogs.com/mikelij/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mikelij/archive/2012/05/13/2496768.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mikelij/archive/2012/05/13/2496768.html"/><content type="html">&lt;p&gt;最近才看到网上有一种对asp.net web form的误解。也有很多讨论，弄得微软ScottGu也来澄清。asp.net mvc和web form是并行存在的两种开发模式。许多人对web form的诟病很多，其中最主要的就是说viewstate，随便一个web form页面，其html源码就体积很大，主要是隐藏字段viewstate体积比较大，至少几十K，页面复杂一点，viewstate的大小能上几兆，这样大体积的页面，在浏览器和服务器之间传输，对网络带宽也是一个很大的压力，所以asp.net webform的性能肯定受很大影响。这其实是一个对asp.net web form的特大误解。这里提供一个小技巧。可以让asp.net web form的页面和asp.net mvc的页面一样体积小巧。同时还能享受viewstate带来的好处。&lt;/p&gt;&lt;p&gt;举例来说：一个显示记录列表的form。如下图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/12720/2012051316370230.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;这是一个很简单的页面了。其html源代码是：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt; &lt;br/&gt; &lt;br/&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br/&gt; &lt;br/&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br/&gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;&lt;br/&gt; &lt;br/&gt;&amp;lt;/title&amp;gt;&lt;br/&gt;&amp;lt;/head&amp;gt;&lt;br/&gt;&amp;lt;body&amp;gt;&lt;br/&gt;    &amp;lt;form method="post" action="Default.aspx" id="form1"&amp;gt;&lt;br/&gt;&amp;lt;div class="aspNetHidden"&amp;gt;&lt;br/&gt;&amp;lt;input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /&amp;gt;&lt;br/&gt;&amp;lt;input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /&amp;gt;&lt;br/&gt;&amp;lt;input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTE5MTIyNjE4Mg9kFgJmD2QWAgIDD2QWAgIBD2QWAgIDDzwrABECAA8WBB4LXyFEYXRhQm91bmRnHgtfIUl0ZW1Db3VudALCA2QMFCsABxYIHgROYW1lBQlBZGRyZXNzSUQeCklzUmVhZE9ubHloHgRUeXBlGSsBHglEYXRhRmllbGQFCUFkZHJlc3NJRBYIHwIFDEFkZHJlc3NMaW5lMR8DaB8EGSsCHwUFDEFkZHJlc3NMaW5lMRYIHwIFDEFkZHJlc3NMaW5lMh8DaB8EGSsCHwUFDEFkZHJlc3NMaW5lMhYIHwIFBENpdHkfA2gfBBkrAh8FBQRDaXR5FggfAgUNU3RhdGVQcm92aW5jZR8DaB8EGSsCHwUFDVN0YXRlUHJvdmluY2UWCB8CBQ1Db3VudHJ5UmVnaW9uHwNoHwQZKwIfBQUNQ291bnRyeVJlZ2lvbhYIHwIFClBvc3RhbENvZGUfA2gfBBkrAh8FBQpQb3N0YWxDb2RlFgJmD2QWDAIBD2QWDmYPDxYCHgRUZXh0BQE5ZGQCAQ8PFgIfBgURODcxMyBZb3NlbWl0ZSBDdC5kZAICDw8WAh8GBQYmbmJzcDtkZAIDDw8WAh8GBQdCb3RoZWxsZGQCBA8PFgIfBgUKV2FzaGluZ3RvbmRkAgUPDxYCHwYFDVVuaXRlZCBTdGF0ZXNkZAIGDw8WAh8GBQU5ODAxMWRkAgIPZBYOZg8PFgIfBgUCMTFkZAIBDw8WAh8GBRMxMzE4IExhc2FsbGUgU3RyZWV0ZGQCAg8PFgIfBgUGJm5ic3A7ZGQCAw8PFgIfBgUHQm90aGVsbGRkAgQPDxYCHwYFCldhc2hpbmd0b25kZAIFDw8WAh8GBQ1Vbml0ZWQgU3RhdGVzZGQCBg8PFgIfBgUFOTgwMTFkZAIDD2QWDmYPDxYCHwYFAjI1ZGQCAQ8PFgIfBgUQOTE3OCBKdW1waW5nIFN0LmRkAgIPDxYCHwYFBiZuYnNwO2RkAgMPDxYCHwYFBkRhbGxhc2RkAgQPDxYCHwYFBVRleGFzZGQCBQ8PFgIfBgUNVW5pdGVkIFN0YXRlc2RkAgYPDxYCHwYFBTc1MjAxZGQCBA9kFg5mDw8WAh8GBQIyOGRkAgEPDxYCHwYFEDkyMjggVmlhIERlbCBTb2xkZAICDw8WAh8GBQYmbmJzcDtkZAIDDw8WAh8GBQdQaG9lbml4ZGQCBA8PFgIfBgUHQXJpem9uYWRkAgUPDxYCHwYFDVVuaXRlZCBTdGF0ZXNkZAIGDw8WAh8GBQU4NTAwNGRkAgUPZBYOZg8PFgIfBgUCMzJkZAIBDw8WAh8GBREyNjkxMCBJbmRlbGEgUm9hZGRkAgIPDxYCHwYFBiZuYnNwO2RkAgMPDxYCHwYFCE1vbnRyZWFsZGQCBA8PFgIfBgUGUXVlYmVjZGQCBQ8PFgIfBgUGQ2FuYWRhZGQCBg8PFgIfBgUHSDFZIDJINWRkAgYPDxYCHgdWaXNpYmxlaGRkGAEFJGN0bDAwJENvbnRlbnRQbGFjZUhvbGRlcjEkZ3JkQWRkcmVzcw88KwAMAQgCWmTq1MHx+5oLH4bMzg2GUy0MyKZQYkR2RY+bxLLJQFR/nQ==" /&amp;gt;&lt;br/&gt;&amp;lt;/div&amp;gt;&lt;br/&gt; &lt;br/&gt;&amp;lt;script type="text/javascript"&amp;gt; &lt;br/&gt;//&amp;lt;![CDATA[&lt;br/&gt;var theForm = document.forms['form1'];&lt;br/&gt;if (!theForm) {&lt;br/&gt;    theForm = document.form1;&lt;br/&gt;}&lt;br/&gt;function __doPostBack(eventTarget, eventArgument) {&lt;br/&gt;    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {&lt;br/&gt;        theForm.__EVENTTARGET.value = eventTarget;&lt;br/&gt;        theForm.__EVENTARGUMENT.value = eventArgument;&lt;br/&gt;        theForm.submit();&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;//]]&amp;gt;&lt;br/&gt;&amp;lt;/script&amp;gt;&lt;br/&gt; &lt;br/&gt; &lt;br/&gt;    &amp;lt;div&amp;gt;&lt;br/&gt;        &lt;br/&gt;    &amp;lt;span id="ContentPlaceHolder1_Label1"&amp;gt;My label&amp;lt;/span&amp;gt;&lt;br/&gt;&amp;lt;div&amp;gt;&lt;br/&gt;&amp;lt;table cellspacing="0" rules="all" border="1" id="ContentPlaceHolder1_grdAddress" style="border-collapse:collapse;"&amp;gt;&lt;br/&gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;th scope="col"&amp;gt;AddressID&amp;lt;/th&amp;gt;&amp;lt;th scope="col"&amp;gt;AddressLine1&amp;lt;/th&amp;gt;&amp;lt;th scope="col"&amp;gt;AddressLine2&amp;lt;/th&amp;gt;&amp;lt;th scope="col"&amp;gt;City&amp;lt;/th&amp;gt;&amp;lt;th scope="col"&amp;gt;StateProvince&amp;lt;/th&amp;gt;&amp;lt;th scope="col"&amp;gt;CountryRegion&amp;lt;/th&amp;gt;&amp;lt;th scope="col"&amp;gt;PostalCode&amp;lt;/th&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td&amp;gt;9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8713 Yosemite Ct.&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Bothell&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Washington&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;United States&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;98011&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1318 Lasalle Street&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Bothell&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Washington&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;United States&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;98011&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td&amp;gt;25&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9178 Jumping St.&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Dallas&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Texas&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;United States&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;75201&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td&amp;gt;28&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9228 Via Del Sol&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Phoenix&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Arizona&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;United States&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;85004&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td&amp;gt;32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;26910 Indela Road&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Montreal&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Quebec&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Canada&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;H1Y 2H5&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td colspan="7"&amp;gt;&amp;lt;table&amp;gt;&lt;br/&gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td&amp;gt;&amp;lt;span&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$2')"&amp;gt;2&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$3')"&amp;gt;3&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$4')"&amp;gt;4&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$5')"&amp;gt;5&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$6')"&amp;gt;6&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$7')"&amp;gt;7&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$8')"&amp;gt;8&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$9')"&amp;gt;9&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$10')"&amp;gt;10&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$11')"&amp;gt;...&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$Last')"&amp;gt;&amp;gt;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&lt;br/&gt;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&lt;br/&gt;&amp;lt;/table&amp;gt;&lt;br/&gt;&amp;lt;/div&amp;gt;&lt;br/&gt;&amp;lt;br /&amp;gt;&lt;br/&gt; &lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;    &amp;lt;/form&amp;gt;&lt;br/&gt;&amp;lt;/body&amp;gt;&lt;br/&gt;&amp;lt;/html&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;p&gt;可见其隐藏字段viewstate体积较大。对应用程序的性能会有较大影响。&amp;nbsp;&lt;/p&gt;&lt;p&gt;通过如下方法，可以让页面html源代码体积变小巧。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;using System;&lt;br/&gt;using System.Collections.Generic;&lt;br/&gt;using System.Linq;&lt;br/&gt;using System.Web;&lt;br/&gt;&lt;br/&gt;namespace EntLibSample&lt;br/&gt;{&lt;br/&gt;    public class BasePage : System.Web.UI.Page&lt;br/&gt;    {&lt;br/&gt;        protected override void SavePageStateToPersistenceMedium(object viewState)&lt;br/&gt;        {&lt;br/&gt;            Session["viewState" + this.Context.Request.FilePath] = viewState;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        protected override object LoadPageStateFromPersistenceMedium()&lt;br/&gt;        {&lt;br/&gt;            if (Session["viewState" + this.Context.Request.FilePath] != null)&lt;br/&gt;            {&lt;br/&gt;                return Session["viewState" + this.Context.Request.FilePath];&lt;br/&gt;            }&lt;br/&gt;            return string.Empty;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;这个BasePage类继承了System.Web.UI.Page类。System.Web.UI.Page中的SavePageStateToPersistenceMedium和LoadPageStateFromPersistenceMedium方法是将viewstate的内容发到客户端浏览器中，那么每次向服务器发请求，都需将体积庞大的viewstate字段发回服务器，服务器返回结果时，又将体积庞大的viewstate字段发回来。这给应用程序整体性能带来了很大冲击。BasePage类改写了此两个方法。将viewstate内容放到session中，用的时候又从session取回来。这样避免了在网络上来回传输体积庞大的viewstate内容。&amp;nbsp;&lt;/p&gt;&lt;p&gt;应用程序的所有页面都继承此BasePage类。这样就可以将此方法应用于所有的asp.net web form页面。&lt;/p&gt;&lt;p&gt;其效果如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt; &lt;br/&gt; &lt;br/&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br/&gt; &lt;br/&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br/&gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;&lt;br/&gt; &lt;br/&gt;&amp;lt;/title&amp;gt;&lt;br/&gt;&amp;lt;/head&amp;gt;&lt;br/&gt;&amp;lt;body&amp;gt;&lt;br/&gt;    &amp;lt;form method="post" action="Default.aspx" id="form1"&amp;gt;&lt;br/&gt;&amp;lt;div class="aspNetHidden"&amp;gt;&lt;br/&gt;&amp;lt;input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /&amp;gt;&lt;br/&gt;&amp;lt;input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /&amp;gt;&lt;br/&gt;&amp;lt;input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" /&amp;gt;&lt;br/&gt;&amp;lt;/div&amp;gt;&lt;br/&gt; &lt;br/&gt;&amp;lt;script type="text/javascript"&amp;gt; &lt;br/&gt;//&amp;lt;![CDATA[&lt;br/&gt;var theForm = document.forms['form1'];&lt;br/&gt;if (!theForm) {&lt;br/&gt;    theForm = document.form1;&lt;br/&gt;}&lt;br/&gt;function __doPostBack(eventTarget, eventArgument) {&lt;br/&gt;    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {&lt;br/&gt;        theForm.__EVENTTARGET.value = eventTarget;&lt;br/&gt;        theForm.__EVENTARGUMENT.value = eventArgument;&lt;br/&gt;        theForm.submit();&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;//]]&amp;gt;&lt;br/&gt;&amp;lt;/script&amp;gt;&lt;br/&gt; &lt;br/&gt; &lt;br/&gt;    &amp;lt;div&amp;gt;&lt;br/&gt;        &lt;br/&gt;    &amp;lt;span id="ContentPlaceHolder1_Label1"&amp;gt;My label&amp;lt;/span&amp;gt;&lt;br/&gt;&amp;lt;div&amp;gt;&lt;br/&gt;&amp;lt;table cellspacing="0" rules="all" border="1" id="ContentPlaceHolder1_grdAddress" style="border-collapse:collapse;"&amp;gt;&lt;br/&gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;th scope="col"&amp;gt;AddressID&amp;lt;/th&amp;gt;&amp;lt;th scope="col"&amp;gt;AddressLine1&amp;lt;/th&amp;gt;&amp;lt;th scope="col"&amp;gt;AddressLine2&amp;lt;/th&amp;gt;&amp;lt;th scope="col"&amp;gt;City&amp;lt;/th&amp;gt;&amp;lt;th scope="col"&amp;gt;StateProvince&amp;lt;/th&amp;gt;&amp;lt;th scope="col"&amp;gt;CountryRegion&amp;lt;/th&amp;gt;&amp;lt;th scope="col"&amp;gt;PostalCode&amp;lt;/th&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td&amp;gt;9&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;8713 Yosemite Ct.&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Bothell&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Washington&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;United States&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;98011&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;1318 Lasalle Street&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Bothell&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Washington&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;United States&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;98011&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td&amp;gt;25&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9178 Jumping St.&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Dallas&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Texas&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;United States&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;75201&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td&amp;gt;28&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;9228 Via Del Sol&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Phoenix&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Arizona&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;United States&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;85004&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td&amp;gt;32&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;26910 Indela Road&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Montreal&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Quebec&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Canada&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;H1Y 2H5&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td colspan="7"&amp;gt;&amp;lt;table&amp;gt;&lt;br/&gt;&amp;lt;tr&amp;gt;&lt;br/&gt;&amp;lt;td&amp;gt;&amp;lt;span&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$2')"&amp;gt;2&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$3')"&amp;gt;3&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$4')"&amp;gt;4&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$5')"&amp;gt;5&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$6')"&amp;gt;6&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$7')"&amp;gt;7&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$8')"&amp;gt;8&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$9')"&amp;gt;9&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$10')"&amp;gt;10&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$11')"&amp;gt;...&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$grdAddress','Page$Last')"&amp;gt;&amp;gt;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&lt;br/&gt;&amp;lt;/table&amp;gt;&amp;lt;/td&amp;gt;&lt;br/&gt;&amp;lt;/tr&amp;gt;&lt;br/&gt;&amp;lt;/table&amp;gt;&lt;br/&gt;&amp;lt;/div&amp;gt;&lt;br/&gt;&amp;lt;br /&amp;gt;&lt;br/&gt; &lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;    &amp;lt;/form&amp;gt;&lt;br/&gt;&amp;lt;/body&amp;gt;&lt;br/&gt;&amp;lt;/html&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;可见viewstate字段的内容完全没有了。这样html源代码的整体体积就小了很多。这对应用程序的性能提高是很大好处的。曾经只有asp.net mvc才有的体积小页面，现在asp.net web form也可以做到了。同时asp.net web form还有开发效率相对较高，还可以利用viewstate带来的好处，有了这些综合考虑，大家应该会重拾对asp.net web form的信心，继续在asp.net web form的旅程。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mikelij/aggbug/2496768.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mikelij/archive/2012/05/13/2496768.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mikelij/archive/2012/05/10/2495036.html</id><title type="text">asp.net development server 挂起问题解决</title><summary type="text">昨日突然发现调试asp.net应用程序时，IE总是显示connecting，长时间不显示页面。开始分析是什么原因，发现firefox访问此asp.net development server，也是长时间没有显示页面。是asp.net development server有什么问题了。想不出什么直接的原因，于是就在网上搜索，用一些关键字如：asp.net development server not working, asp.net development serverlong time no response, asp.net development server hang, 等等等等，搜到一</summary><published>2012-05-10T13:42:00Z</published><updated>2012-05-10T13:42:00Z</updated><author><name>mikelij</name><uri>http://www.cnblogs.com/mikelij/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mikelij/archive/2012/05/10/2495036.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mikelij/archive/2012/05/10/2495036.html"/><content type="html">&lt;p&gt;昨日突然发现调试asp.net应用程序时，IE总是显示connecting，长时间不显示页面。开始分析是什么原因，发现firefox访问此asp.net development server，也是长时间没有显示页面。是asp.net development server有什么问题了。想不出什么直接的原因，于是就在网上搜索，用一些关键字如：asp.net development server not working, asp.net development server&amp;nbsp;long time no response, asp.net development server hang, 等等等等，搜到一些信息都没有帮助，有的说把IE options里reset一下就可以，试了好多方法就是没有解决。后来看到asp.net development server只能使用localhost来访问，不能从别的主机过来访问，不过此处正是本机，应该localhost没有问题的。中间还试图调整IE的zone，也没有解决。后来突然想起，试试127.0.0.1，一试，果然可以。而localhost不行，看来是localhost这个域名出了问题。ping localhost, 果然，localhost被映射成了::1， 于是找到C:\Windows\System32\drivers\etc\hosts， 发现：&lt;/p&gt;&lt;p&gt;# localhost name resolution is handled within DNS itself.&lt;br /&gt;#&amp;nbsp;127.0.0.1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; localhost&lt;br /&gt;#&amp;nbsp;::1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; localhost&lt;/p&gt;&lt;p&gt;这些行都是注释的。&lt;/p&gt;&lt;p&gt;为什么localhost映射成了::1呢，试着写了一行127.0.0.1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; localhost，重启，果然发现asp.net development server正常了。&lt;/p&gt;&lt;p&gt;这个与IPv6有关，于是把所有IPv6全都disable了。这下应该没有啥问题了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mikelij/aggbug/2495036.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mikelij/archive/2012/05/10/2495036.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mikelij/archive/2012/05/02/2475788.html</id><title type="text">Application pool自动停止问题解决及IIS 7.x 503错误解决</title><summary type="text">一网友说其IIS 7.5总是报503错误。笔者给其远程连过去一看，开始怀疑是IIS设置问题。比如，Application pool的.net版本与应用程序的版本不一致，或者网站的绑定有问题，找来找去，也没有找到正确的原因。想到试试没有.net的情况，就做了一个静态HTML文件，将此文件放到IIS网站中，浏览此html文件，还是报503错误，通过观察，发现此网站对应的Application pool老是在接收到http请求后就自动停止了。试了几次都是如此。在网上找了一下，有人说要将Application pool的identity变一下(http://www.iisboy.com/iis_art</summary><published>2012-05-02T14:26:00Z</published><updated>2012-05-02T14:26:00Z</updated><author><name>mikelij</name><uri>http://www.cnblogs.com/mikelij/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mikelij/archive/2012/05/02/2475788.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mikelij/archive/2012/05/02/2475788.html"/><content type="html">&lt;p&gt;一网友说其IIS 7.5总是报503错误。笔者给其远程连过去一看，开始怀疑是IIS设置问题。比如，Application pool的.net版本与应用程序的版本不一致，或者网站的绑定有问题，找来找去，也没有找到正确的原因。想到试试没有.net的情况，就做了一个静态HTML文件，将此文件放到IIS网站中，浏览此html文件，还是报503错误，通过观察，发现此网站对应的Application pool老是在接收到http请求后就自动停止了。试了几次都是如此。在网上找了一下，有人说要将Application pool的identity变一下(&lt;a href="http://www.iisboy.com/iis_article/398.html"&gt;http://www.iisboy.com/iis_article/398.html&lt;/a&gt;)，比如localservice,localsystem, networkservice, ApplicationPoolIdentity, 本机的管理员账户，等，试了好几个帐号以后还是不行，于是就继续找答案，开始怀疑这个IIS装的有问题。后来找到一个人也有同样的问题，也是做了一个HTML文件，还是不能解决问题，但是这个仁兄试了装上了http重定向(http redirection)特性后， Application pool自动停止的问题就解决了。但是问题还没有结束。访问此HTML还是报503错误。这种问题就比较复杂了。笔者觉得其IIS已经被弄坏了。建议该网友重装Windows 7。该网友照做了，问题果然解决了。后来想了一下，应该有其他办法的，比如进行http.sys的问题排查，但是那样会比较复杂。重装系统的方法在这些方法中最简单。问题解决了就行了。&lt;/p&gt;&lt;p&gt;希望能帮到你!&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mikelij/aggbug/2475788.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mikelij/archive/2012/05/02/2475788.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mikelij/archive/2012/03/29/2424313.html</id><title type="text">asp.net MVC 3多语言方案--再次写, 配源码</title><summary type="text">之前写了一篇asp.net MVC多语言方案，那次其实是为American Express银行开发的。有许多都是刚开始接触，对其也不太熟悉。现在再回过头去看，自己做一个小网站，完全用asp.net mvc 3的技术。要实现多语言，并且要求可以动态换语言。在有数据输入的地方，其数据输入校验的界面也是不一样的，比如必须输入的字段，英文显示：required, 中文就显示：请输入，等等。这里的方法和之前的文章的方法略有不同。1. 资源文件多语言的资源文件还是一个单独的.net 工程，里面只放资源文件。可以建一个class library的工程。工程名字叫Resource。里面只加入资源文件.resx</summary><published>2012-03-29T14:09:00Z</published><updated>2012-03-29T14:09:00Z</updated><author><name>mikelij</name><uri>http://www.cnblogs.com/mikelij/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mikelij/archive/2012/03/29/2424313.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mikelij/archive/2012/03/29/2424313.html"/><content type="html">&lt;p&gt;之前写了一篇asp.net MVC多语言方案，那次其实是为American Express银行开发的。有许多都是刚开始接触，对其也不太熟悉。现在再回过头去看，自己做一个小网站，完全用asp.net mvc 3的技术。要实现多语言，并且要求可以动态换语言。在有数据输入的地方，其数据输入校验的界面也是不一样的，比如必须输入的字段，英文显示：required, 中文就显示：请输入，等等。这里的方法和之前的文章的方法略有不同。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1. 资源文件&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;多语言的资源文件还是一个单独的.net 工程，里面只放资源文件。可以建一个class library的工程。工程名字叫Resource。里面只加入资源文件.resx。资源文件加入时，一种语言一个文件，这个有基础的人都知道，不多说。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/12720/2012032921134436.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;唯一要注意的是：要将Access Modifier置成Public。这样IDE会为其产生c#代码。其类是包以外的类也能访问的。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/12720/2012032921184422.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2. 在View中使用资源文件&lt;/p&gt;&lt;p&gt;在_ViewStart.cshtml中最前面加上这么一行。&lt;/p&gt;&lt;p&gt;@{CommonUtil.ResourceLoader.SetCurrentThreadCulture(Session);}&lt;/p&gt;&lt;p&gt;后面会介绍&amp;nbsp;ResourceLoader.SetCurrentThreadCulture的代码。此方法是根据Session["Culture"]来设置当前线程的Culture和UI Culture。在此处加上这么一行，将会对所有的本应用程序的view有影响。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;见这个代码，这是本人这个小网站的layout，即相当于asp.net 2.0时代的master page。&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;&amp;lt;!&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;DOCTYPE html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;@ViewBag.Title&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;link &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@Url.Content("&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;~/Content/Site.css")" rel&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="stylesheet"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/css"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 6&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;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@Url.Content("&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;~/Scripts/jquery-1.5.1.min.js")" type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;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;br /&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 9&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: #ff0000;"&gt;class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="wrap"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&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: #ff0000;"&gt;class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="header"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&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: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="logo"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="logo"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;a &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@Url.Content("&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;~/")"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;img &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;border&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@Url.Content(Resource.Views.Shared.Layout.Logo)"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&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;br /&gt;&lt;span style="color: #008080;"&gt;14&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: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="logo"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="logo"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;img &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;border&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@Url.Content(Resource.Views.Shared.Layout.AnimAd)"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;16&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;br /&gt;&lt;span style="color: #008080;"&gt;17&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: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Links"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="top_nav"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;UL&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;                   &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;LI&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;A &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@Url.Content("&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;~/English/")"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;English&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;LI&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;                   &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;LI&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;A &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@Url.Content("&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;~/Chinese/")"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;中文&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;LI&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;                   &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;LI&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;A &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@Url.Content("&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;~/ContactUs/")"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;@Resource.Views.Shared.Layout.ContactUS&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;LI&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;UL&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;23&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;br /&gt;&lt;span style="color: #008080;"&gt;24&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;br /&gt;&lt;span style="color: #008080;"&gt;25&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: #ff0000;"&gt;class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="content"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;         @RenderBody()&lt;br /&gt;&lt;span style="color: #008080;"&gt;27&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;br /&gt;&lt;span style="color: #008080;"&gt;28&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: #ff0000;"&gt;id &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="FooterSection"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="footer"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;amp;copy;&lt;/span&gt; @Resource.Views.Shared.Layout.CopyRight &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;30&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;br /&gt;&lt;span style="color: #008080;"&gt;31&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;br /&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;见到使用资源文件的地方了吗？如：@Resource.Views.Shared.Layout.ContactUS，还有@Resource.Views.Shared.Layout.CopyRight，这两个是文本的多语言。还有图片的多语言，即在&amp;lt;img中的Resource.Views.Shared.Layout.Logo。即实现了两个语言版本的图片，用这个资源存储多个语言版本的图片路径。页面中显示哪一个，就根据当前用户的语言偏好。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3. 动态切换语言&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;注意到上面的代码里有一个English和中文的链接了吗。点这两个链接都会有相应的controller处理。这里的controller是这样的代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;p&gt;&lt;span style="background-color: #f5f5f5; font-family: Courier New;"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.Mvc;&lt;br /&gt;using System.Threading;&lt;br /&gt;using CommonUtil;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #f5f5f5; font-family: Courier New;"&gt;namespace ApplicationExpertShare.Controllers&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class EnglishController : Controller&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // GET: /English/&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #f5f5f5; font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ActionResult Index()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Globalization.CultureInfo englishCulture = new System.Globalization.CultureInfo("en-US");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Session["Culture"] = englishCulture;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this.Redirect(this.Request.UrlReferrer.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #f5f5f5; font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;这里调用了一个ResourceLoader类来切换语言。中文的controller也一样：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;p&gt;&lt;span style="background-color: #f5f5f5; font-family: Courier New;"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.Mvc;&lt;br /&gt;using System.Reflection;&lt;br /&gt;using System.Threading;&lt;br /&gt;using CommonUtil;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #f5f5f5; font-family: Courier New;"&gt;namespace ApplicationExpertShare.Controllers&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class ChineseController : Controller&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // GET: /Chinese/&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #f5f5f5; font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ActionResult Index()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Globalization.CultureInfo chineseCulture = new System.Globalization.CultureInfo("zh-CN");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Session["Culture"] = chineseCulture;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this.Redirect(this.Request.UrlReferrer.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;那么究竟ResourceLoader类做了什么呢，竟然能动态切换语言？看代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;p&gt;&lt;span style="background-color: #f5f5f5; font-family: Courier New;"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Globalization;&lt;br /&gt;using System.Reflection;&lt;br /&gt;using System.Resources;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.Mvc;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #f5f5f5; font-family: Courier New;"&gt;namespace CommonUtil&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static class ResourceLoader&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void SetCurrentThreadCulture(HttpSessionStateBase session)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (session != null &amp;amp;&amp;amp; session["Culture"] != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Threading.Thread.CurrentThread.CurrentCulture = (System.Globalization.CultureInfo)session["Culture"];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Threading.Thread.CurrentThread.CurrentUICulture = (System.Globalization.CultureInfo)session["Culture"];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;它究竟干了什么呢？&lt;/p&gt;&lt;p&gt;第一步：判断Session是否空，还有Session["Culture"]是否空。因为这两个都有可能为空。&lt;br /&gt;第二步：根据Session["Culture"]设置当前线程的Culture和UI Culture。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4. Model类的多语言&lt;/p&gt;&lt;p&gt;&lt;br /&gt;asp.net MVC少不了Model类，Model类在输入界面里还有input validation信息，这些input validation的信息也应该是能多语言的。比如最常见的必须输入字段，我们用英文就显示"Required"，用中文就显示：&amp;ldquo;请输入&amp;rdquo;。如何做呢？见代码：&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;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.ComponentModel.DataAnnotations;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; Resource.Entity;&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;namespace&lt;/span&gt; DataEntity&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;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; UserAccount&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;#region&lt;/span&gt; private members&lt;br /&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _iID;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; _strName;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; _strEmail;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; _strPassword;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; _strConfirmPassword;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; System.Decimal _Balance;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; Properties&lt;br /&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ID&lt;br /&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt;             {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; _iID;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt;             {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt;                 _iID = value;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt;         [Required(ErrorMessageResourceType=&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), ErrorMessageResourceName=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Common_Required_ErrorMessage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt;         [StringLength(&lt;span style="color: #800080;"&gt;30&lt;/span&gt;, ErrorMessageResourceType=&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), ErrorMessageResourceName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;NAME_StringLength_ErrorMessage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt;         [RegularExpression(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;[a-zA-Z].*&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, ErrorMessageResourceType=&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), ErrorMessageResourceName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;NAME_RegularExpression_ErrorMessage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt;         [Display(ResourceType=&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), Name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;NAME_DisplayName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; NAME&lt;br /&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt;             {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; _strName;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt;             {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt;                 _strName = value;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt;         [Required(ErrorMessageResourceType=&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), ErrorMessageResourceName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Common_Required_ErrorMessage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt;         [RegularExpression(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;[a-z0-9!#$%&amp;amp;'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&amp;amp;'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt;             , ErrorMessageResourceType=&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), ErrorMessageResourceName=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EMAIL_RegularExpression_ErrorMessage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt;         [Display(ResourceType=&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), Name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EMAIL_DisplayName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; EMAIL&lt;br /&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt;             {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; _strEmail;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt;             {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt;                 _strEmail = value;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt;         [Display(ResourceType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;PASSWORD_DisplayName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt;         [Required(ErrorMessageResourceType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), ErrorMessageResourceName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Common_Required_ErrorMessage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt;         [StringLength(&lt;span style="color: #800080;"&gt;32&lt;/span&gt;, ErrorMessageResourceType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), ErrorMessageResourceName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;PASSWORD_StringLength&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, MinimumLength = &lt;span style="color: #800080;"&gt;8&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; PASSWORD&lt;br /&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt;             {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; _strPassword;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt;             {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt;                 _strPassword = value;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt;         [Required(ErrorMessageResourceType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), ErrorMessageResourceName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Common_Required_ErrorMessage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt;         [Display(ResourceType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CONFIRMPASSWORD_DisplayName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt;         [Compare(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;PASSWORD&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, ErrorMessageResourceType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), ErrorMessageResourceName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CONFIRMPASSWORD_CompareErrorMessage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; CONFIRMPASSWORD&lt;br /&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt;         {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt;             {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; _strConfirmPassword;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt;             {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt;                 _strConfirmPassword = value;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt;         [Required(ErrorMessageResourceType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), ErrorMessageResourceName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Common_Required_ErrorMessage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt;         [Display(ResourceType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;OLDNAME_DisplayName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; OldName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt;         [Required(ErrorMessageResourceType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), ErrorMessageResourceName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Common_Required_ErrorMessage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt;         [Display(ResourceType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;OLDEMAIL_DisplayName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; OldEmail { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt;         [Required(ErrorMessageResourceType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), ErrorMessageResourceName = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Common_Required_ErrorMessage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt;104&lt;/span&gt;         [Display(ResourceType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;OLDPassword_DisplayName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt;105&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; OldPassword { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;106&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;107&lt;/span&gt;         [Display(ResourceType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Resource.Entity.UserAccount), Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Balance&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: #008080;"&gt;108&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt; Balance { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;109&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;110&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt;111&lt;/span&gt; }&lt;/div&gt;&lt;p&gt;这个类显示了如何在DataAnnotations中使用资源文件的多语言信息。这些Attribute都接受一个ResourceType, 和一个Resource String的名字。这里可以再说一点，就是RegularExpressionAttribute， 可以用资源文件存储正则表达式，这样还可以实现不同的语言采用不同的数据验证规则。剩下的就是如何在Resource工程里规划好资源文件了。稍有基础的人都知道，就不多说了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;5. 结束语&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一个全局的资源文件可以带来许多好处。比如集中管理资源。所有资源都在这个特定的工程里面。当然也有坏处，就是当资源越来越多时，就会难于管理。到时可以想一些折衷的办法。要么将资源文件放到两个资源工程里面；要么也可以允许一些local的资源文件。这些的问题只有遇到的时候才会找到合适的办法。需要根据实际情况来采取一些办法。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2012.5.13. 注：已经针对评论做了修改，现在已经可以支持多用户，而且多用户互相不影响。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mikelij/aggbug/2424313.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mikelij/archive/2012/03/29/2424313.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mikelij/archive/2012/03/11/2388481.html</id><title type="text">完全分布模式hadoop集群安装配置之二 添加新节点组成分布式集群</title><summary type="text">前文说到如何搭建集群中第一个节点，这篇将说到如何向集群添加节点。这篇是基于前文的，没有看过前文的可以参考此链接：http://www.cnblogs.com/mikelij/archive/2012/03/06/2380937.html2 向集群添加节点 前文已经建立了一个节点的hadoop集群。现在要做的添加节点。安装JDK, 创建hadoop用户等见前文。这里就不重复了。2.1 检查主机名,修改/etc/hostname, /etc/hosts新节点需要在这个集群里叫一个名字，给此节点命名，比如slavenode1, slavenode2, etc.集群里新加入的服务器都需要在/etc/h</summary><published>2012-03-11T01:37:00Z</published><updated>2012-03-11T01:37:00Z</updated><author><name>mikelij</name><uri>http://www.cnblogs.com/mikelij/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mikelij/archive/2012/03/11/2388481.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mikelij/archive/2012/03/11/2388481.html"/><content type="html">&lt;p&gt;前文说到如何搭建集群中第一个节点，这篇将说到如何向集群添加节点。这篇是基于前文的，没有看过前文的可以参考此链接：&lt;a href="http://www.cnblogs.com/mikelij/archive/2012/03/06/2380937.html"&gt;http://www.cnblogs.com/mikelij/archive/2012/03/06/2380937.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2 向集群添加节点&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 前文已经建立了一个节点的hadoop集群。现在要做的添加节点。安装JDK, 创建hadoop用户等见前文。这里就不重复了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2.1 检查主机名,修改/etc/hostname, /etc/hosts&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;新节点需要在这个集群里叫一个名字，给此节点命名，比如slavenode1, slavenode2, etc.集群里新加入的服务器都需要在/etc/hostname中改名，将规定的服务器名放在/etc/hostname文件中。然后将已有服务器上的/etc/hosts拷贝过来。再加上此新节点的主机名。然后再复制到群里每一个服务器中。即所有集群中服务器的/etc/hosts文件要一样。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2.2 配置SSH Key以便hadoop用户无密码登录集群&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 与前文不同的是，此处只需要将之前的节点产生的ssh key等拷贝过来就可以了。用hadoop用户登录，&lt;/p&gt;&lt;p&gt;sudo apt-get install ssh&lt;/p&gt;&lt;p&gt;安装完ssh就可以从已有的服务器上拷贝ssh key了。&lt;/p&gt;&lt;p&gt;mkdir /home/hadoop/.ssh&lt;/p&gt;&lt;p&gt;scp hadoop@namenode:/home/hadoop/.ssh/* /home/hadoop/.ssh/&lt;/p&gt;&lt;p&gt;这就拷贝过来了。之所以要从已有服务器上拷贝ssh key，是因为如果两个服务器的ssh key不一致，则第一次连服务器时，还是需要密码的。这里的需求是hadoop用户连任何一个集群中的服务器都不需要密码，因此需要拷贝已有服务器上的ssh key.&lt;/p&gt;&lt;p&gt;下面需要从此节点用ssh命令连 到已有的所有节点上去。已有的节点只有一个时，假设本节点的主机名是slavenode1, 就ssh namenode, ssh localhost, ssh slavenode1。如果已经有namenode, slavenode1, slavenode2...&amp;nbsp;到slavenode6, 那么就尝试ssh namenode, ssh slavenode1, ssh slavenode2, ..., ssh slavenode6, ssh localhost. 保证这些连接都是不需要密码就可连接的就可以了。另外在换到其他机器上，都ssh 此节点的主机名，如ssh slavenode1s。这样的方法，就可以保证每台机器间都可以用ssh无密码就可以连接。用的用户都是hadoop。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2.3 安装hadoop包&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 可参考前文的1.5， 这里就不重复了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2.4 namenode上的hadoop配置&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;集群里要加入新的节点，可以在namenode服务器上的mapred-site.xml中加入dfs.hosts和mapred.hosts两个元素。即象这样：&lt;/p&gt;&lt;p&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;name&amp;gt;dfs.hosts&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;value&amp;gt;/usr/local/hadoop/hadoop-0.20.203.0/conf/slaves&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;name&amp;gt;mapred.hosts&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;value&amp;gt;/usr/local/hadoop/hadoop-0.20.203.0/conf/slaves&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;/p&gt;&lt;p&gt;然后再在/usr/local/hadoop/hadoop-0.20.203.0/conf/slaves文件中写上集群中所有的节点的主机名。一个主机名占一行。如：&lt;/p&gt;&lt;p&gt;namenode&lt;/p&gt;&lt;p&gt;slavenode1&lt;/p&gt;&lt;p&gt;slavenode2&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;如果dfs.hosts和mapred.hosts已经加好了，就只需要到slaves中加入一行。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2.5 新加入节点的hadoop配置&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;集群中所有节点的hadoop配置要全部保持一致。即那些core-site.xml, hdfs-site.xml, mapred-site.xml, masters, slaves可以从已有节点处拷贝过来。包括/etc/environment也可以从已有节点那里拷贝过来。用scp命令，上面已经用过了，再用scp拷贝这些文件过来。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2.6 新加入节点启动&lt;/p&gt;&lt;p&gt;start-dfs.sh&lt;/p&gt;&lt;p&gt;start-mapred.sh&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2.7 通知namenode和jobtracker有新节点加入&lt;/p&gt;&lt;p&gt;在第一台服务器(namenode兼jobtracker)运行的情况下，到第一台服务器那里，&lt;/p&gt;&lt;p&gt;hadoop dfsadmin -refreshNodes&lt;/p&gt;&lt;p&gt;这是通知hdfs有新节点加入&lt;/p&gt;&lt;p&gt;hadoop mradmin -refreshNodes&lt;/p&gt;&lt;p&gt;这是通知jobtracker有新节点加入&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2.8 验证集群是否正常工作&lt;/p&gt;&lt;p&gt;还是老办法，用一些常用命令将一些服务器上的本地文件方到服务器上，如：&lt;/p&gt;&lt;p&gt;hadoop fs -put testfolder uploadfolder&lt;/p&gt;&lt;p&gt;再拷贝，删除等做一做。&lt;/p&gt;&lt;p&gt;另外验证jobtracker和所有的tasktracker是否正常工作，还是用wordcount示例来运行：&lt;/p&gt;&lt;p&gt;hadoop jar hadoop-examples-0.20.203.0.jar wordcount input output&lt;/p&gt;&lt;p&gt;得到大概这样的结果就对了, 即map增长到100%, reduce也增长到100%。&lt;/p&gt;&lt;p&gt;访问&lt;a href="http://namenode:50070/"&gt;http://namenode:50070/&lt;/a&gt;&amp;nbsp;可以看到集群里所有的datanode&lt;/p&gt;&lt;p&gt;还有&lt;a href="http://namenode:50030/"&gt;http://namenode:50030/&lt;/a&gt;&amp;nbsp;可以看到集群里所有的tasktracker&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2.7 启动集群&lt;/p&gt;&lt;p&gt;namenode上运行：&lt;/p&gt;&lt;p&gt;start-all.sh&lt;/p&gt;&lt;p&gt;slavenode上运行：&lt;/p&gt;&lt;p&gt;start-dfs.sh&lt;/p&gt;&lt;p&gt;start-mapred.sh&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2.8 停止集群&lt;/p&gt;&lt;p&gt;slavenode上运行：&lt;/p&gt;&lt;p&gt;stop-mapred.sh&lt;/p&gt;&lt;p&gt;stop-dfs.sh&lt;/p&gt;&lt;p&gt;namenode上运行：&lt;/p&gt;&lt;p&gt;stop-all.sh&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2.9 遇到的问题&lt;/p&gt;&lt;p&gt;Too many fetch-failures问题&lt;/p&gt;&lt;p&gt;这次还是遇到了这个问题，和单机时一样的错误信息Too many fetch-failures，略有不同的是reduce不是卡在0%，而是卡在17%那里就不动了。&lt;/p&gt;&lt;p&gt;这次又是到处检查，最后发现是第一台服务器的/etc/hosts文件里少写了一个服务器名字。将这个服务器名字补上以后，这个wordcount示例就可以正常运行了。&lt;/p&gt;&lt;p&gt;所以集群中所有服务器的/etc/hosts, core-site.xml, hdfs-site.xml, mapred-site.xml, masters, slaves，还有ssh key所在.ssh目录等文件和目录都需完全一样。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;以上说的是往集群里添加节点，这里说的是添加第二个节点，此过程适用于以后所有新节点的添加。第三个一直到第n个都是按同样的方法来添加。只要重复以上过程就可以了。&lt;/p&gt;&lt;p&gt;本文就说到这里。后文再说一些hadoop集群管理的内容。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mikelij/aggbug/2388481.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mikelij/archive/2012/03/11/2388481.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mikelij/archive/2012/03/06/2380937.html</id><title type="text">完全分布模式hadoop集群安装配置之一安装第一个节点</title><summary type="text">本系列文章讲述搭建完全分布模式hadoop的安装配置过程，还将讲述完全分布式模式的一些基本操作。准备采用先单机调通再加入节点的方式。本文只讲述单节点的安装和配置。同时讲解如何解决一些遇到的问题。</summary><published>2012-03-06T00:24:00Z</published><updated>2012-03-06T00:24:00Z</updated><author><name>mikelij</name><uri>http://www.cnblogs.com/mikelij/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mikelij/archive/2012/03/06/2380937.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mikelij/archive/2012/03/06/2380937.html"/><content type="html">&lt;p&gt;&amp;nbsp; 本系列文章讲述搭建完全分布模式hadoop的安装配置过程，还将讲述完全分布式模式的一些基本操作。准备采用先单机调通再加入节点的方式。本文只讲述单节点的安装和配置。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1.&amp;nbsp;Namenode和JobTracker的安装&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这是完全分布模式集群的第一台，也是很关键的一台。采用VMWARE虚拟的Ubuntu Linux 11.10&amp;nbsp; server版。安装Linux非本文重点就不说了。&amp;nbsp;默认建立了一个用户叫abc, 其有sudo权限。root的口令是随机的一个口令，只能用sudo命令暂时提升到root权限。为保险起见，安装完系统第一件事就是改root密码。用sudo passwd root，系统不会问你要原口令，直接输入新口令两遍即可。有root口令在手，后面万一操作错误不至于束手无策。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1.1 安装JDK1.6&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 有个命令可以很快地安装jdk,&amp;nbsp;&amp;nbsp; sudo apt-get install sun-java6-jdk, 这是ubuntu系统本身一个机制。当时试了一下，没有成功，记得说是找不到包。不知道啥原因，要不网络不行，要不包名不对了。就放弃了。只好找另外的办法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 到Oracle网站上找到JDK 1.6的目前最新版本 JDK 1.6.0_31. 得到其下载链接：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/12720/2012030520393665.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/12720/2012030520422259.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;选这个是因为它是32位的JDK, Ubuntu Linux选的是32位的。JDK所以也选32位。点&amp;ldquo;Accept License Agreement", 右键点到"jdk-6u31-linux-i586.bin"上，在属性中得到其链接：&lt;a href="http://download.oracle.com/otn-pub/java/jdk/6u31-b04/jdk-6u31-linux-i586.bin"&gt;http://download.oracle.com/otn-pub/java/jdk/6u31-b04/jdk-6u31-linux-i586.bin&lt;/a&gt;,&amp;nbsp; 再回到虚拟机中，用abc登录，输入命令：&lt;/p&gt;&lt;p&gt;wget &lt;a href="http://download.oracle.com/otn-pub/java/jdk/6u31-b04/jdk-6u31-linux-i586.bin"&gt;http://download.oracle.com/otn-pub/java/jdk/6u31-b04/jdk-6u31-linux-i586.bin&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这下载需要一段时间。等下载完成后，在/home/abc/下就有一个jdk-6u31-linux-i586.bin的文件。&lt;/p&gt;&lt;p&gt;sudo mkdir /usr/lib/jvm&lt;/p&gt;&lt;p&gt;cd /usr/lib/jvm&lt;/p&gt;&lt;p&gt;sudo mkdir java&lt;/p&gt;&lt;p&gt;cd java&lt;/p&gt;&lt;p&gt;sudo cp&amp;nbsp;/home/abc/jdk-6u31-linux-i586.bin&amp;nbsp;&amp;nbsp;.&lt;/p&gt;&lt;p&gt;sudo chmod 777 jdk-6u31-linux-i586.bin&lt;/p&gt;&lt;p&gt;./jdk-6u31-linux-i586.bin&lt;/p&gt;&lt;p&gt;这样就开始安装jdk了。一会就安装好了。&lt;/p&gt;&lt;p&gt;sudo vi /etc/environment&lt;/p&gt;&lt;p&gt;将此文件做如下修改：&lt;/p&gt;&lt;p&gt;在PATH那一行后面添加&amp;nbsp;&amp;nbsp; :/usr/lib/jvm/java/jdk1.6.0_31/bin&amp;nbsp;&amp;nbsp; 注意/usr前面那个冒号是需要的。&lt;/p&gt;&lt;p&gt;再加这两行：&lt;/p&gt;&lt;p&gt;CLASSPATH=.:/usr/lib/jvm/java/jdk1.6.0_31/lib&lt;/p&gt;&lt;p&gt;JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_31&lt;/p&gt;&lt;p&gt;保存&lt;/p&gt;&lt;p&gt;说明：有的地方说linux 系统本身会默认安装一些包如openjdk包，就会造成多个jvm共存。还需要用update -alternatives 命令去选择默认的jvm到刚安装的jdk目录。&lt;/p&gt;&lt;p&gt;发现Ubuntu Linux11.10 server版默认没有装其他的任何jdk包，在此之前连java命令都无法运行，所以不需要运行update-alternatives 命令了。&lt;/p&gt;&lt;p&gt;sudo reboot&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1.2 建立hadoop用户和hadoop组&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;重启系统后，登录abc用户&lt;/p&gt;&lt;p&gt;sudo addgroup hadoop&lt;/p&gt;&lt;p&gt;sudo adduser --ingroup hadoop hadoop&lt;/p&gt;&lt;p&gt;输入新口令两遍，然后是一些无关紧要的信息，一路回车直到完成命令。hadoop用户就建立了。&lt;/p&gt;&lt;p&gt;su&lt;/p&gt;&lt;p&gt;输入root的口令，成功后就换成了root用户&lt;/p&gt;&lt;p&gt;继续输入命令：&lt;/p&gt;&lt;p&gt;chmod u+w /etc/sudoers&lt;/p&gt;&lt;p&gt;vi /etc/sudoers&lt;/p&gt;&lt;p&gt;在此行：root&amp;nbsp;&amp;nbsp;&amp;nbsp; ALL=(ALL:ALL) ALL&amp;nbsp; 后加一行：&lt;/p&gt;&lt;p&gt;hadoop&amp;nbsp; ALL=(ALL:ALL) ALL&lt;/p&gt;&lt;p&gt;意思就是允许hadoop用户sudo运行任何命令&lt;/p&gt;&lt;p&gt;保存&lt;/p&gt;&lt;p&gt;chmod u-w&amp;nbsp; /etc/sudoers&lt;/p&gt;&lt;p&gt;这是把sudoers文件的权限改回440, 即root用户通常也只读。Ubuntu linux的sudo 命令运行时会检查这个文件权限是否440, 如果不是440, sudo命令都没有办法工作。所以改完之后一定要改回原来的440.&lt;/p&gt;&lt;p&gt;作为root用户的任务就结束了，输入exit退出root用户&lt;/p&gt;&lt;p&gt;再输入exit退出abc用户&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1.3 配置SSH Key以便hadoop用户无密码登录集群&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;再用刚刚建立的用户hadoop来登录，&lt;/p&gt;&lt;p&gt;sudo apt-get install ssh&lt;/p&gt;&lt;p&gt;ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa &lt;br /&gt;cat ~/.ssh/id_dsa.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;/p&gt;&lt;p&gt;要用命令ssh localhost来测试一下ssh是否工作，如果不用输入口令那就正确。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1.4&amp;nbsp;检查主机名,修改/etc/hostname, /etc/hosts&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;sudo vi /etc/hostname&lt;/p&gt;&lt;p&gt;检查系统自动分配的主机名是否合适，不合适的话改成一个有意义的名字，如namenode,保存&lt;/p&gt;&lt;p&gt;ifconfig&lt;/p&gt;&lt;p&gt;看看当前IP,记录下来。&lt;/p&gt;&lt;p&gt;sudo vi /etc/hosts&lt;/p&gt;&lt;p&gt;那些127开头的两行都不用动，&lt;/p&gt;&lt;p&gt;在后面加刚刚记录的IP 和新改的主机名，保存&lt;/p&gt;&lt;p&gt;这个很重要。不正确地做的话，可能后面jobtracker的reduce步骤运行不正常。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1.5 安装hadoop包&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;从&lt;a href="http://hadoop.apache.org/common/releases.html"&gt;http://hadoop.apache.org/common/releases.html&lt;/a&gt;找一个当前的stable的版本。找到了0.20.203.0版本，找一个比较近的镜像站点。wget下载此包到/home/hadoop/目录下。&lt;/p&gt;&lt;p&gt;继续以hadoop用户输入命令&lt;/p&gt;&lt;p&gt;sudo mkdir /usr/local/hadoop&lt;/p&gt;&lt;p&gt;sudo chown hadoop:hadoop /usr/local/hadoop&lt;/p&gt;&lt;p&gt;cp /home/hadoop/hadoop-0.20.203.0rc1.tar.gz&amp;nbsp; /usr/local/hadoop&lt;/p&gt;&lt;p&gt;cd /usr/local/hadoop&lt;/p&gt;&lt;p&gt;tar zxvf hadoop-0.20.203.0rc1.tar.gz&lt;/p&gt;&lt;p&gt;cd hadoop-0.20.203.0/conf&lt;/p&gt;&lt;p&gt;vi hadoop-env.sh&lt;/p&gt;&lt;p&gt;就把这行改成这样：export JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_31/， 其他都可以暂时不动。&lt;/p&gt;&lt;p&gt;vi core-site.xml&lt;/p&gt;&lt;p&gt;里面是空的，将其内容改成：&lt;/p&gt;&lt;p&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;name&amp;gt;fs.default.name&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;value&amp;gt;hdfs://namenode:9000&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;name&amp;gt;hadoop.tmp.dir&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;value&amp;gt;/home/hadoop/tmp&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/p&gt;&lt;p&gt;vi hdfs-site.xml， 加入：&lt;/p&gt;&lt;p&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;name&amp;gt;fs.default.name&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;value&amp;gt;hdfs://namenode:9000&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;name&amp;gt;hadoop.tmp.dir&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;value&amp;gt;/home/hadoop/tmp&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;name&amp;gt;dfs.replication&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;/p&gt;&lt;p&gt;这个dfs.replication表示数据复制的份数，生产环境就不可能是1了，当然是要大于1了。&lt;/p&gt;&lt;p&gt;vi mapred-site.xml，将其改成：&lt;/p&gt;&lt;p&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;name&amp;gt;fs.default.name&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;value&amp;gt;hdfs://namenode:9000&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;name&amp;gt;hadoop.tmp.dir&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;value&amp;gt;/home/hadoop/tmp&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;name&amp;gt;dfs.replication&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;name&amp;gt;mapred.job.tracker&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;value&amp;gt;namenode:9001&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;/p&gt;&lt;p&gt;注意这里jobtracker和namenode选用了同一个主机，即在同一台机器上，生产环境是可以namenode和jobtracker分开成两个机器的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;都改完成了。就修改一下PATH变量：&lt;/p&gt;&lt;p&gt;sudo vi /etc/environment&lt;/p&gt;&lt;p&gt;在PATH那一行后面再加上&amp;nbsp;&amp;nbsp; :/usr/local/hadoop/hadoop-0.20.203.0/bin&amp;nbsp;&amp;nbsp; 保存， 这是为了能随时可用hadoop的命令。&lt;/p&gt;&lt;p&gt;sudo reboot重启&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1.6&amp;nbsp; 格式化hdfs&lt;/p&gt;&lt;p&gt;再用hadoop用户登录，&lt;/p&gt;&lt;p&gt;hadoop namenode -format&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1.7 启动此单机配置及验证&lt;/p&gt;&lt;p&gt;start-all.sh&lt;/p&gt;&lt;p&gt;此hadoop单个节点的就启动了。&lt;/p&gt;&lt;p&gt;验证可以用：&lt;/p&gt;&lt;p&gt;jps&lt;/p&gt;&lt;p&gt;出这样的结果就对了：&lt;/p&gt;&lt;p&gt;3156 NameNode&lt;br /&gt;2743 SecondaryNameNode&lt;br /&gt;3447 Jps&lt;br /&gt;2807 JobTracker&lt;br /&gt;2909 TaskTracker&lt;br /&gt;2638 DataNode&lt;/p&gt;&lt;p&gt;再hadoop dfsadmin -report&lt;/p&gt;&lt;p&gt;能显示出hdfs的信息&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;访问&lt;a href="http://namenode:50070/"&gt;http://namenode:50070/&lt;/a&gt;&amp;nbsp;显示hdfs的信息&lt;/p&gt;&lt;p&gt;还有&lt;a href="http://namenode:50030/"&gt;http://namenode:50030/&lt;/a&gt;&amp;nbsp;显示jobtracker的信息&lt;/p&gt;&lt;p&gt;再可以用一些常用命令将文件放到hdfs上，如&lt;/p&gt;&lt;p&gt;hadoop fs -put test.txt /user/hadoop/test.text&lt;/p&gt;&lt;p&gt;以上可以证明hdfs基本正常.下面要验证jobtracker和taskTracker是否正常，准备运行hadoop example中的wordcount程序。&lt;/p&gt;&lt;p&gt;cd /usr/local/hadoop/hadoop/hadoop-0.20.203.0&lt;/p&gt;&lt;p&gt;hadoop fs -put conf input&lt;/p&gt;&lt;p&gt;将conf目录拷贝到hdfs&lt;/p&gt;&lt;p&gt;hadoop jar hadoop-examples-0.20.203.0.jar wordcount input output&lt;/p&gt;&lt;p&gt;得到大概这样的结果就对了, 即map增长到100%, reduce也增长到100%，&lt;/p&gt;&lt;p&gt;12/03/05 07:52:09 INFO input.FileInputFormat: Total input paths to process : 15&lt;br /&gt;12/03/05 07:52:09 INFO mapred.JobClient: Running job: job_201203050735_0001&lt;br /&gt;12/03/05 07:52:10 INFO mapred.JobClient:&amp;nbsp; map 0% reduce 0%&lt;br /&gt;12/03/05 07:52:24 INFO mapred.JobClient:&amp;nbsp; map 13% reduce 0%&lt;br /&gt;12/03/05 07:52:25 INFO mapred.JobClient:&amp;nbsp; map 26% reduce 0%&lt;br /&gt;12/03/05 07:52:30 INFO mapred.JobClient:&amp;nbsp; map 40% reduce 0%&lt;br /&gt;12/03/05 07:52:31 INFO mapred.JobClient:&amp;nbsp; map 53% reduce 0%&lt;br /&gt;12/03/05 07:52:36 INFO mapred.JobClient:&amp;nbsp; map 66% reduce 13%&lt;br /&gt;12/03/05 07:52:37 INFO mapred.JobClient:&amp;nbsp; map 80% reduce 13%&lt;br /&gt;12/03/05 07:52:39 INFO mapred.JobClient:&amp;nbsp; map 80% reduce 17%&lt;br /&gt;12/03/05 07:52:42 INFO mapred.JobClient:&amp;nbsp; map 100% reduce 17%&lt;br /&gt;12/03/05 07:52:51 INFO mapred.JobClient:&amp;nbsp; map 100% reduce 100%&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient: Job complete: job_201203050735_0001&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient: Counters: 26&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; Job Counters&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Launched reduce tasks=1&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SLOTS_MILLIS_MAPS=68532&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total time spent by all reduces waiting after reserving slots (ms)=0&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total time spent by all maps waiting after reserving slots (ms)=0&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rack-local map tasks=7&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Launched map tasks=15&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Data-local map tasks=8&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SLOTS_MILLIS_REDUCES=25151&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; File Output Format Counters&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bytes Written=14249&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; FileSystemCounters&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILE_BYTES_READ=21493&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HDFS_BYTES_READ=27707&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILE_BYTES_WRITTEN=384596&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HDFS_BYTES_WRITTEN=14249&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; File Input Format Counters&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bytes Read=25869&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; Map-Reduce Framework&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reduce input groups=754&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map output materialized bytes=21577&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Combine output records=1047&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map input records=734&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reduce shuffle bytes=21577&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reduce output records=754&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Spilled Records=2094&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map output bytes=34601&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Combine input records=2526&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map output records=2526&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPLIT_RAW_BYTES=1838&lt;br /&gt;12/03/05 07:52:56 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reduce input records=1047&lt;/p&gt;&lt;p&gt;&amp;nbsp;最后再hadoop fs -get output /home/hadoop&amp;nbsp;&amp;nbsp; 将output目录取到本地来查看结果。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1.8&amp;nbsp; 单机的停止&lt;/p&gt;&lt;p&gt;stop-all.sh&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1.9 遇到的问题&lt;/p&gt;&lt;p&gt;Too many fetch-failures问题&lt;/p&gt;&lt;p&gt;运行wordcount示例时，reduce任务无法达到100%总是卡住在0%.&lt;/p&gt;&lt;p&gt;分析log里面有Too many fetch-failures信息，上网查了一下，有人说要将IP地址还有hostname都要写到/etc/hosts里面，才行。&lt;/p&gt;&lt;p&gt;照着做了一下，发现还是不行。正头大之际，经过不懈努力，终于找到症结：原来ubuntu linux给指定的一个主机名是192，这个主机名192已经成了hdfs的标准配置了。即使本人后来将主机名改成有意义的名字，这个顺序已经不对了，因为发现logs目录下的每个任务的配置文件xml文件还是用的老主机名，新改的主机名根本就没有用上，而这个老主机名存在哪里呢，后来发现这个主机名存在hdfs文件系统的那些文件里。所以需要从1.4步开始到1.8步重新做一遍。如此重新做了一遍以后，运行wordcount示例程序就成功了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;本人回答过qq群里同仁的问题：&lt;/p&gt;&lt;p&gt;运行hadoop&amp;nbsp;namenode -format报main函数找不到&lt;/p&gt;&lt;p&gt;回答：CLASSPATH设置不对。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;单机安装配置就讲这么多。本文就说到这里了。本文之后的文章将说到如何将新的hadoop节点加入，让多个节点成为一个完全分步式的集群。&lt;/p&gt;&lt;p&gt;如果觉得本文有帮助，请帮忙点推荐。谢谢&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mikelij/aggbug/2380937.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mikelij/archive/2012/03/06/2380937.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mikelij/archive/2011/10/24/2222159.html</id><title type="text">SqlServer数据库记录数大引起的一系列问题解决</title><summary type="text">这是笔者qq群里一个同仁问的问题。同时他遇到的问题随着时间推移也在变化，但是都与数据量大有关。1. 大数据量下的delete问题2. 大数据量下的update问题该同仁说他的数据库数据记录比较多，大约几百万条记录的级别。删除一条记录10分钟都不能完成。他很头痛。问有没有解决办法。我想起我写的文章&lt;&lt;关于大型asp.net应用系统的架构—如何做到高性能高可伸缩性&gt;&gt;一文，我提到过，delete不要实时去做。可以集中来处理。在实时只是给这个记录做个需要删除标记(用update语句就可以了)。到晚上系统不忙的时候再来集中处理，来真正删除记录。然后这个同仁就按这个办法去做了。后</summary><published>2011-10-23T16:22:00Z</published><updated>2011-10-23T16:22:00Z</updated><author><name>mikelij</name><uri>http://www.cnblogs.com/mikelij/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mikelij/archive/2011/10/24/2222159.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mikelij/archive/2011/10/24/2222159.html"/><content type="html">&lt;p&gt;这是笔者qq群里一个同仁问的问题。同时他遇到的问题随着时间推移也在变化，但是都与数据量大有关。&lt;/p&gt;&lt;p&gt;1. 大数据量下的delete问题&lt;/p&gt;&lt;p&gt;2. 大数据量下的update问题&lt;/p&gt;&lt;p&gt;该同仁说他的数据库数据记录比较多，大约几百万条记录的级别。删除一条记录10分钟都不能完成。他很头痛。问有没有解决办法。我想起我写的文章&amp;lt;&amp;lt;&lt;a href="http://www.cnblogs.com/mikelij/archive/2010/11/30/1892261.html"&gt;关于大型asp.net应用系统的架构&amp;mdash;如何做到高性能高可伸缩性&lt;/a&gt;&amp;gt;&amp;gt;一文，我提到过，delete不要实时去做。可以集中来处理。在实时只是给这个记录做个需要删除标记(用update语句就可以了)。到晚上系统不忙的时候再来集中处理，来真正删除记录。然后这个同仁就按这个办法去做了。后来告诉我说delete问题解决了，快一些了。虽然我没有见过他的数据库是什么样子，但是能帮他解决问题，我也很高兴。&lt;/p&gt;&lt;p&gt;过了几个月，他又有新问题了，他说，数据更多了，现在即使给要删除的记录做个标记(即一个update语句)也要很长时间，要几十分钟。我问了下情况，原来是前面那个问题的的升级版问题。他现在给要删除的记录做待删除标记，用一个有WHERE条件的update语句。找到WHERE条件的记录，即一个搜寻的过程。现在就是按这个WHERE条件搜寻过程需要很长时间。我问了他的WHERE条件是什么，还问了他的cluster index是什么，和non-cluster index是什么。最后发现他的WHERE条件既不匹配cluster index, 也不匹配non-cluster index。所以即使是一个Update也特别耗时间。于是对他讲了如何选cluster index, 比如短的字段，并且有单向递增特性。他照我说的方法去做了。然后说千万级别的记录，给一个记录标记需要删除就快很多了。只要一秒多就完成了。呵呵，我心中又是很高兴的。&lt;/p&gt;&lt;p&gt;希望能帮到你!&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mikelij/aggbug/2222159.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mikelij/archive/2011/10/24/2222159.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mikelij/archive/2011/10/19/2218184.html</id><title type="text">asp.net MVC3, webform和Unity 2实现的多语言方案</title><summary type="text">半年多没有写博了。今天稍微写点。今天写的这些东西还是在今年四到六月的时候在美国工作时获得的一点东西。公司派过去的拿工作签证在那里工作。客户是美国运通。项目是他们的一个叫Serve的电子钱包服务平台。当时主要是设计并实现MVC 3的多语言方案。这些技术方案都有现成的。比如msdn上就有链接。那篇英文博文用了不同的视图来实现多语言。在客户这里他们的需求和那篇博文的情况不一样。客户这里的需求是希望controller和view都有本地化版本，model就在多语言之间共享。他们希望在同一套编译出的程序，只需要改一下web.config，就能切换语言，其界面，和商务逻辑也跟着变了。同时技术上的要求也和那</summary><published>2011-10-19T14:23:00Z</published><updated>2011-10-19T14:23:00Z</updated><author><name>mikelij</name><uri>http://www.cnblogs.com/mikelij/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mikelij/archive/2011/10/19/2218184.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mikelij/archive/2011/10/19/2218184.html"/><content type="html">&lt;p&gt;半年多没有写博了。今天稍微写点。今天写的这些东西还是在今年四到六月的时候在美国工作时获得的一点东西。公司派过去的拿工作签证在那里工作。客户是美国运通。项目是他们的一个叫Serve的电子钱包服务平台。当时主要是设计并实现MVC 3的多语言方案。这些技术方案都有现成的。比如msdn上就有链接。那篇英文博文用了不同的视图来实现多语言。在客户这里他们的需求和那篇博文的情况不一样。客户这里的需求是希望controller和view都有本地化版本，model就在多语言之间共享。他们希望在同一套编译出的程序，只需要改一下web.config，就能切换语言，其界面，和商务逻辑也跟着变了。同时技术上的要求也和那篇博文不一样，还需要利用Unity 2来实现对不同的商务逻辑和controller，view的访问；另外他们这里的系统挺庞大，旧的webform页面也很多，这次只把一部分页面转换成MVC技术，所以我们也得为webform准备解决方案。最开始的时候是先熟悉一下环境，做一些技术预研制。我是工作快20年的人了，很快进入了角色。&lt;/p&gt;&lt;p&gt;&amp;nbsp; 开始做了一个webform的多语言，这是成熟技术了。没啥好说的。我们用的都是全局资源。类似这样的代码就会有很多：&amp;lt;title&amp;gt;&amp;lt;asp:Literal Text='&amp;lt;% $ Resources: Glossary, DefaultPageTitle %&amp;gt;' runat="server"&amp;gt;&amp;lt;/asp:Literal&amp;gt;&amp;lt;/title&amp;gt;，还试着实时换界面。这次在那里学到了一个以前没有了解的技术，就是ExpressionBuilder，这个技术可以让Page请求处理过程中动态地解析所需要的资源。如过不用ExpressionBuilder，就只能继承所有的常用的webform服务器端控件，在新的子类里面加上一个资源名属性，只要这个属性的值被设置上，就可以去相关全局资源里取得相应资源。客户这里本来就是已经把所有webform的服务器端控件全都继承了，写了新类。所以用第二种方法也是可行的。实际也是这么做的。&lt;/p&gt;&lt;p&gt;&amp;nbsp; 至于MVC。我们想出来了一个解决方案。即在Global.asax.cs里面应用启动的时候，创建Unity 容器，Unity配置是只需要将那些controller所在的名称空间写在Unity配置文件里面即可。另外需要继承DefaultControllerFactory类。这是默认的controller创建的类。我们需要改写该类。当我们需要将某个controller实例化的时候，Unity容器会自动去这些名称空间找到符合该名字的controller类并返回一个该类的实例。这里有一个问题，就是多个语言的controller是同样的名字的，这会让Unity报错的。所以我们得覆盖掉DefaultControllerFactory类的GetControllerType方法。当判断到当前线程的culture是什么的时候，就知道应该取哪个controller了。只需要取得相应controller的Type, 然后返回就可以了。剩下的事情就都交给Unity来实现就可以了。&lt;/p&gt;&lt;p&gt;&amp;nbsp; 尽管实现了根据culture来选择controller, 该controller对应的view还需要进行设置。如果没有进行设置，其默认的view还是英语的。需要设置其对应语言的view的path.如中文的view, 动态地取得viewengine, 将viewengine的viewpath改成中文的viewpath.这样的话，就可以有若干个区分开的view, 每一个对应一种语言，它们可以有不同的布局，不同的字段。&lt;/p&gt;&lt;p&gt;&amp;nbsp; View所绑定的model是一个多个语言组合起来的。它有美国特有的字段，也有中国特有的字段。当用于美国时，中国特有的字段就空着。用于中国时，美国的那些特殊字段就空着。model每个字段的显示label是用自定义的attribute实现的，这些attribute可以从全局资源文件里取出字串。还有做数据验证的正则attribute，美国的数据验证和中国的几不一样，例如邮编，美国可以是5位或者9位，而中国是6位。其对应的正则也是不同的。这个正则attribute里可以根据当前线程的culture来取得正确的正则表达式。从而实现对美国和中国的不同数据验证。&lt;/p&gt;&lt;p&gt;&amp;nbsp; 以上都只是一些思想。代码就不贴了。其实我手头也没有。全都在客户那里。这是商业代码。不可能拿出来的。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mikelij/aggbug/2218184.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mikelij/archive/2011/10/19/2218184.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mikelij/archive/2011/03/05/1971612.html</id><title type="text">MS OpenXML SDK 2.0在Excel中指定位置填入数据和插入图片</title><summary type="text">简介 这是公司另外一个项目组遇到的技术问题。即如何用OpenXML在Excel指定位置填入数据和插入图片。笔者知道此事之后，帮他们想了一下办法。 用户的需求是这样的：有一个Excel的文档模版，里面已经有了一个表格框架。需要在某些单元格填入数字或者文字。并在某些单元格插入图片。并且不破坏原有的表格内容。这些功能必须在asp.net应用程序中实现，并且不用Office interop的组件。他们之前...</summary><published>2011-03-05T06:55:00Z</published><updated>2011-03-05T06:55:00Z</updated><author><name>mikelij</name><uri>http://www.cnblogs.com/mikelij/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mikelij/archive/2011/03/05/1971612.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mikelij/archive/2011/03/05/1971612.html"/><content type="html">&lt;p&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;这是公司另外一个项目组遇到的技术问题。即如何用OpenXML在Excel指定位置填入数据和插入图片。笔者知道此事之后，帮他们想了一下办法。&lt;/p&gt; &lt;p&gt;用户的需求是这样的：有一个Excel的文档模版，里面已经有了一个表格框架。需要在某些单元格填入数字或者文字。并在某些单元格插入图片。并且不破坏原有的表格内容。这些功能必须在asp.net应用程序中实现，并且不用Office interop的组件。他们之前已经用了Office interop对象来操作Excel，这样就要求服务器上安装Office，因为之前的方法占用内存大，不稳定，所以用户希望他们另外想办法。用户和他们都知道OpenXML可以读写Excel文件，而且很轻量的，占用资源小，但是他们不知道如何用OpenXML完成这个任务，卡壳好多天了。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mikelij/201103/201103051455025393.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mikelij/201103/201103051455029230.png" width="350" height="288"&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mikelij/201103/201103051455031640.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mikelij/201103/201103051455042620.png" width="372" height="286"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;需求的理解可以见上图，我们需要做的是：&lt;/p&gt; &lt;p&gt;1. 在黄色背景的单元格填入数据&lt;/p&gt; &lt;p&gt;2. 在指定位置插入图片(如上图中的折线图)&lt;/p&gt; &lt;p&gt;上图左图是未填入数据之前的样子。上图右图是完成后的最终结果图。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;实现&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;他们在网路上找了一些参考资料和参考代码，但是其中的对象模型比较复杂，一时半会没有弄明白。笔者聆听他们的需求后，再看了他们的已有代码。调试了一阵，发现这些参考代码对实现他们的需求没有什么用。需要针对他们的需求来改代码才行。&lt;/p&gt; &lt;p&gt;此工程必须引用C:\Program Files (x86)\Open XML SDK\V2.0\lib\DocumentFormat.OpenXml.dll，C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\WindowsBase.dll&lt;/p&gt; &lt;p&gt;以下是核心代码：&lt;/p&gt; &lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;using System;&lt;br/&gt;using System.Collections.Generic;&lt;br/&gt;using System.Linq;&lt;br/&gt;using System.Text;&lt;br/&gt;using System.IO;&lt;br/&gt;using System.Drawing;&lt;br/&gt;using DocumentFormat.OpenXml.Packaging;&lt;br/&gt;using DocumentFormat.OpenXml;&lt;br/&gt;using DocumentFormat.OpenXml.Spreadsheet;&lt;br/&gt;using DocumentFormat.OpenXml.Drawing.Spreadsheet;&lt;br/&gt;using System.Text.RegularExpressions;&lt;br/&gt;using System.Data;&lt;br/&gt;namespace ExcelWriter&lt;br/&gt;{&lt;br/&gt;    public class OpenXMLExcel : IDisposable&lt;br/&gt;    {&lt;br/&gt;        #region Constrution and dispose&lt;br/&gt;       &lt;br/&gt;        SpreadsheetDocument spreadSheet;&lt;br/&gt;        public WorksheetPart CurrentWorksheetPart { get; set; }&lt;br/&gt;        SharedStringTablePart shareStringPart;&lt;br/&gt;        public OpenXMLExcel(Stream stream, bool bCreate)&lt;br/&gt;        {&lt;br/&gt;            if (bCreate == true)&lt;br/&gt;            {&lt;br/&gt;                spreadSheet = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook);&lt;br/&gt;                WorkbookPart workbookPart = spreadSheet.AddWorkbookPart();&lt;br/&gt;                workbookPart.Workbook = new Workbook();&lt;br/&gt;&lt;br/&gt;                WorksheetPart worksheetPart = InsertWorksheet(spreadSheet.WorkbookPart);&lt;br/&gt;&lt;br/&gt;                if (spreadSheet.WorkbookPart.GetPartsOfType&lt;sharedstringtablepart&gt;().Count() &amp;gt; 0)&lt;br/&gt;                {&lt;br/&gt;                    shareStringPart = spreadSheet.WorkbookPart.GetPartsOfType&lt;sharedstringtablepart&gt;().First();&lt;br/&gt;                }&lt;br/&gt;                else&lt;br/&gt;                {&lt;br/&gt;                    shareStringPart = spreadSheet.WorkbookPart.AddNewPart&lt;sharedstringtablepart&gt;();&lt;br/&gt;                }&lt;br/&gt;&lt;br/&gt;                shareStringPart.SharedStringTable = new SharedStringTable();&lt;br/&gt;                shareStringPart.SharedStringTable.Count = 1;&lt;br/&gt;                shareStringPart.SharedStringTable.UniqueCount = 1;&lt;br/&gt;&lt;br/&gt;                CurrentWorksheetPart = worksheetPart;&lt;br/&gt;            }&lt;br/&gt;            else&lt;br/&gt;            {&lt;br/&gt;                spreadSheet = SpreadsheetDocument.Open(stream, true);&lt;br/&gt;                shareStringPart = spreadSheet.WorkbookPart.GetPartsOfType&lt;sharedstringtablepart&gt;().First();&lt;br/&gt;                CurrentWorksheetPart = spreadSheet.WorkbookPart.WorksheetParts.First();&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        public void Dispose()&lt;br/&gt;        {&lt;br/&gt;            spreadSheet.Close();&lt;br/&gt;            spreadSheet.Dispose();&lt;br/&gt;        }&lt;br/&gt;        &lt;br/&gt;        #endregion&lt;br/&gt;        #region Public interface&lt;br/&gt;        public void WriteData(int x, int y, string strContent)&lt;br/&gt;        {&lt;br/&gt;            DataTable dt = new DataTable();&lt;br/&gt;            dt.Columns.Add("Column1");&lt;br/&gt;            dt.Rows.Add(strContent);&lt;br/&gt;            WriteDataIntoWorkSheet(x, y, dt);&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        public void WriteDataIntoWorkSheet(int startx, int starty, DataTable dt)&lt;br/&gt;        {&lt;br/&gt;            //if (startx &amp;lt; 1)&lt;br/&gt;            //    startx = 1;&lt;br/&gt;            //if (starty &amp;lt; 1)&lt;br/&gt;            //    starty = 1;&lt;br/&gt;&lt;br/&gt;            WorksheetPart worksheetPart = CurrentWorksheetPart;&lt;br/&gt;            //starty -= 1;&lt;br/&gt;            int j = 0;&lt;br/&gt;            foreach (DataRow dr in dt.Rows)&lt;br/&gt;            {&lt;br/&gt;                j++;&lt;br/&gt;                for (int i = 0; i &amp;lt; dt.Columns.Count; i++)&lt;br/&gt;                {&lt;br/&gt;                    string name = GetColumnName(i + starty);&lt;br/&gt;                    string text = Convert.IsDBNull(dr[i]) ? "" : dr[i].ToString();&lt;br/&gt;                    int index = InsertSharedStringItem(text, shareStringPart);&lt;br/&gt;                    Cell cell = InsertCellInWorksheet(name, Convert.ToUInt32(j + startx), worksheetPart);&lt;br/&gt;&lt;br/&gt;                    cell.CellValue = new CellValue(index.ToString());&lt;br/&gt;                    cell.DataType = new EnumValue&lt;cellvalues&gt;(CellValues.SharedString);&lt;br/&gt;                    worksheetPart.Worksheet.Save();&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        public void WriteDataIntoWorkSheet(int startx, int starty, string[][] data)&lt;br/&gt;        {&lt;br/&gt;            WorksheetPart worksheetPart = CurrentWorksheetPart;&lt;br/&gt;            starty -= 1;&lt;br/&gt;            int i = 0;&lt;br/&gt;            foreach (string[] row in data)&lt;br/&gt;            {&lt;br/&gt;                int j = 0;&lt;br/&gt;                foreach (string text in row)&lt;br/&gt;                {&lt;br/&gt;                    string name = GetColumnName(j + starty);&lt;br/&gt;                    int index = InsertSharedStringItem(text, shareStringPart);&lt;br/&gt;                    Cell cell = InsertCellInWorksheet(name, Convert.ToUInt32(i + startx), worksheetPart);&lt;br/&gt;&lt;br/&gt;                    cell.CellValue = new CellValue(index.ToString());&lt;br/&gt;                    cell.DataType = new EnumValue&lt;cellvalues&gt;(CellValues.SharedString);&lt;br/&gt;                    worksheetPart.Worksheet.Save();&lt;br/&gt;                    j++;&lt;br/&gt;                }&lt;br/&gt;                i++;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;        public void AddNewWorksheet()&lt;br/&gt;        {&lt;br/&gt;            WorkbookPart workbookPart = spreadSheet.WorkbookPart;&lt;br/&gt;&lt;br/&gt;            WorksheetPart newWorksheetPart = workbookPart.AddNewPart&lt;worksheetpart&gt;();&lt;br/&gt;            newWorksheetPart.Worksheet = new Worksheet(new SheetData());&lt;br/&gt;            newWorksheetPart.Worksheet.Save();&lt;br/&gt;            CurrentWorksheetPart = newWorksheetPart;&lt;br/&gt;            //workbookPart.SharedStringTablePart.SharedStringTable.Count = workbookPart.SharedStringTablePart.SharedStringTable.Count + 1;&lt;br/&gt;            //workbookPart.SharedStringTablePart.SharedStringTable.UniqueCount = workbookPart.SharedStringTablePart.SharedStringTable.UniqueCount + 1;&lt;br/&gt;            string relationshipId = workbookPart.GetIdOfPart(newWorksheetPart);&lt;br/&gt;            Sheets sheets = workbookPart.Workbook.GetFirstChild&lt;sheets&gt;();&lt;br/&gt;            uint sheetId = 1;&lt;br/&gt;            if (sheets.Elements&lt;sheet&gt;().Count() &amp;gt; 0)&lt;br/&gt;            {&lt;br/&gt;                sheetId = sheets.Elements&lt;sheet&gt;().Select(s =&amp;gt; s.SheetId.Value).Max() + 1;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            string sheetName = "Sheet" + sheetId;&lt;br/&gt;&lt;br/&gt;            // Append the new worksheet and associate it with the workbook.&lt;br/&gt;            Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };&lt;br/&gt;            sheets.Append(sheet);&lt;br/&gt;            workbookPart.Workbook.Save();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        public void InsertImage(long x, long y, long? width, long? height, string sImagePath)&lt;br/&gt;        {&lt;br/&gt;            try&lt;br/&gt;            {&lt;br/&gt;                WorksheetPart wsp = CurrentWorksheetPart;&lt;br/&gt;                DrawingsPart dp;&lt;br/&gt;                ImagePart imgp;&lt;br/&gt;                WorksheetDrawing wsd;&lt;br/&gt;&lt;br/&gt;                ImagePartType ipt;&lt;br/&gt;                switch (sImagePath.Substring(sImagePath.LastIndexOf('.') + 1).ToLower())&lt;br/&gt;                {&lt;br/&gt;                    case "png":&lt;br/&gt;                        ipt = ImagePartType.Png;&lt;br/&gt;                        break;&lt;br/&gt;                    case "jpg":&lt;br/&gt;                    case "jpeg":&lt;br/&gt;                        ipt = ImagePartType.Jpeg;&lt;br/&gt;                        break;&lt;br/&gt;                    case "gif":&lt;br/&gt;                        ipt = ImagePartType.Gif;&lt;br/&gt;                        break;&lt;br/&gt;                    default:&lt;br/&gt;                        return;&lt;br/&gt;                }&lt;br/&gt;&lt;br/&gt;                if (wsp.DrawingsPart == null)&lt;br/&gt;                {&lt;br/&gt;                    //----- no drawing part exists, add a new one&lt;br/&gt;&lt;br/&gt;                    dp = wsp.AddNewPart&lt;drawingspart&gt;();&lt;br/&gt;                    imgp = dp.AddImagePart(ipt, wsp.GetIdOfPart(dp));&lt;br/&gt;                    wsd = new WorksheetDrawing();&lt;br/&gt;                }&lt;br/&gt;                else&lt;br/&gt;                {&lt;br/&gt;                    //----- use existing drawing part&lt;br/&gt;&lt;br/&gt;                    dp = wsp.DrawingsPart;&lt;br/&gt;                    imgp = dp.AddImagePart(ipt);&lt;br/&gt;                    dp.CreateRelationshipToPart(imgp);&lt;br/&gt;                    wsd = dp.WorksheetDrawing;&lt;br/&gt;                }&lt;br/&gt;&lt;br/&gt;                using (FileStream fs = new FileStream(sImagePath, FileMode.Open))&lt;br/&gt;                {&lt;br/&gt;                    imgp.FeedData(fs);&lt;br/&gt;                }&lt;br/&gt;&lt;br/&gt;                int imageNumber = dp.ImageParts.Count&lt;imagepart&gt;();&lt;br/&gt;                if (imageNumber == 1)&lt;br/&gt;                {&lt;br/&gt;                    Drawing drawing = new Drawing();&lt;br/&gt;                    drawing.Id = dp.GetIdOfPart(imgp);&lt;br/&gt;                    CurrentWorksheetPart.Worksheet.Append(drawing);&lt;br/&gt;                }&lt;br/&gt;&lt;br/&gt;                NonVisualDrawingProperties nvdp = new NonVisualDrawingProperties();&lt;br/&gt;                nvdp.Id = new UInt32Value((uint)(1024 + imageNumber));&lt;br/&gt;                nvdp.Name = "Picture " + imageNumber.ToString();&lt;br/&gt;                nvdp.Description = "";&lt;br/&gt;                DocumentFormat.OpenXml.Drawing.PictureLocks picLocks = new DocumentFormat.OpenXml.Drawing.PictureLocks();&lt;br/&gt;                picLocks.NoChangeAspect = true;&lt;br/&gt;                picLocks.NoChangeArrowheads = true;&lt;br/&gt;                NonVisualPictureDrawingProperties nvpdp = new NonVisualPictureDrawingProperties();&lt;br/&gt;                nvpdp.PictureLocks = picLocks;&lt;br/&gt;                NonVisualPictureProperties nvpp = new NonVisualPictureProperties();&lt;br/&gt;                nvpp.NonVisualDrawingProperties = nvdp;&lt;br/&gt;                nvpp.NonVisualPictureDrawingProperties = nvpdp;&lt;br/&gt;&lt;br/&gt;                DocumentFormat.OpenXml.Drawing.Stretch stretch = new DocumentFormat.OpenXml.Drawing.Stretch();&lt;br/&gt;                stretch.FillRectangle = new DocumentFormat.OpenXml.Drawing.FillRectangle();&lt;br/&gt;&lt;br/&gt;                BlipFill blipFill = new BlipFill();&lt;br/&gt;                DocumentFormat.OpenXml.Drawing.Blip blip = new DocumentFormat.OpenXml.Drawing.Blip();&lt;br/&gt;                blip.Embed = dp.GetIdOfPart(imgp);&lt;br/&gt;                blip.CompressionState = DocumentFormat.OpenXml.Drawing.BlipCompressionValues.Print;&lt;br/&gt;                blipFill.Blip = blip;&lt;br/&gt;                blipFill.SourceRectangle = new DocumentFormat.OpenXml.Drawing.SourceRectangle();&lt;br/&gt;                blipFill.Append(stretch);&lt;br/&gt;&lt;br/&gt;                DocumentFormat.OpenXml.Drawing.Transform2D t2d = new DocumentFormat.OpenXml.Drawing.Transform2D();&lt;br/&gt;                DocumentFormat.OpenXml.Drawing.Offset offset = new DocumentFormat.OpenXml.Drawing.Offset();&lt;br/&gt;                offset.X = 0;&lt;br/&gt;                offset.Y = 0;&lt;br/&gt;                t2d.Offset = offset;&lt;br/&gt;                Bitmap bm = new Bitmap(sImagePath);&lt;br/&gt;&lt;br/&gt;                DocumentFormat.OpenXml.Drawing.Extents extents = new DocumentFormat.OpenXml.Drawing.Extents();&lt;br/&gt;&lt;br/&gt;                if (width == null)&lt;br/&gt;                    extents.Cx = (long)bm.Width * (long)((float)914400 / bm.HorizontalResolution);&lt;br/&gt;                else&lt;br/&gt;                    extents.Cx = width * (long)((float)914400 / bm.HorizontalResolution);&lt;br/&gt;&lt;br/&gt;                if (height == null)&lt;br/&gt;                    extents.Cy = (long)bm.Height * (long)((float)914400 / bm.VerticalResolution);&lt;br/&gt;                else&lt;br/&gt;                    extents.Cy = height * (long)((float)914400 / bm.VerticalResolution);&lt;br/&gt;&lt;br/&gt;                bm.Dispose();&lt;br/&gt;                t2d.Extents = extents;&lt;br/&gt;                ShapeProperties sp = new ShapeProperties();&lt;br/&gt;                sp.BlackWhiteMode = DocumentFormat.OpenXml.Drawing.BlackWhiteModeValues.Auto;&lt;br/&gt;                sp.Transform2D = t2d;&lt;br/&gt;                DocumentFormat.OpenXml.Drawing.PresetGeometry prstGeom = new DocumentFormat.OpenXml.Drawing.PresetGeometry();&lt;br/&gt;                prstGeom.Preset = DocumentFormat.OpenXml.Drawing.ShapeTypeValues.Rectangle;&lt;br/&gt;                prstGeom.AdjustValueList = new DocumentFormat.OpenXml.Drawing.AdjustValueList();&lt;br/&gt;                sp.Append(prstGeom);&lt;br/&gt;                sp.Append(new DocumentFormat.OpenXml.Drawing.NoFill());&lt;br/&gt;&lt;br/&gt;                DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture picture = new DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture();&lt;br/&gt;                picture.NonVisualPictureProperties = nvpp;&lt;br/&gt;                picture.BlipFill = blipFill;&lt;br/&gt;                picture.ShapeProperties = sp;&lt;br/&gt;&lt;br/&gt;                Position pos = new Position();&lt;br/&gt;                pos.X = x * 914400 / 72;&lt;br/&gt;                pos.Y = y * 914400 / 72;&lt;br/&gt;                Extent ext = new Extent();&lt;br/&gt;                ext.Cx = extents.Cx;&lt;br/&gt;                ext.Cy = extents.Cy;&lt;br/&gt;                AbsoluteAnchor anchor = new AbsoluteAnchor();&lt;br/&gt;                anchor.Position = pos;&lt;br/&gt;                anchor.Extent = ext;&lt;br/&gt;                anchor.Append(picture);&lt;br/&gt;                anchor.Append(new ClientData());&lt;br/&gt;                wsd.Append(anchor);&lt;br/&gt;                wsd.Save(dp);&lt;br/&gt;            }&lt;br/&gt;            catch (Exception ex)&lt;br/&gt;            {&lt;br/&gt;                throw ex; // or do something more interesting if you want&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        public void InsertImage(long x, long y, string sImagePath)&lt;br/&gt;        {&lt;br/&gt;            InsertImage(x, y, null, null, sImagePath);&lt;br/&gt;        }&lt;br/&gt;        &lt;br/&gt;        #endregion&lt;br/&gt;        #region private static OpenXml methods&lt;br/&gt;&lt;br/&gt;        private static int InsertSharedStringItem(string text, SharedStringTablePart shareStringPart)&lt;br/&gt;        {&lt;br/&gt;            // If the part does not contain a SharedStringTable, create one.&lt;br/&gt;            if (shareStringPart.SharedStringTable == null)&lt;br/&gt;            {&lt;br/&gt;                shareStringPart.SharedStringTable = new SharedStringTable();&lt;br/&gt;                shareStringPart.SharedStringTable.Count = 1;&lt;br/&gt;                shareStringPart.SharedStringTable.UniqueCount = 1;&lt;br/&gt;            }&lt;br/&gt;            int i = 0;&lt;br/&gt;            // Iterate through all the items in the SharedStringTable. If the text already exists, return its index.&lt;br/&gt;            foreach (SharedStringItem item in shareStringPart.SharedStringTable.Elements&lt;sharedstringitem&gt;())&lt;br/&gt;            {&lt;br/&gt;                if (item.InnerText == text)&lt;br/&gt;                {&lt;br/&gt;                    return i;&lt;br/&gt;                }&lt;br/&gt;                i++;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            // The text does not exist in the part. Create the SharedStringItem and return its index.&lt;br/&gt;            shareStringPart.SharedStringTable.AppendChild(new SharedStringItem(new DocumentFormat.OpenXml.Spreadsheet.Text(text)));&lt;br/&gt;            shareStringPart.SharedStringTable.Save();&lt;br/&gt;&lt;br/&gt;            return i;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        private static Cell InsertCellInWorksheet(string columnName, uint rowIndex, WorksheetPart worksheetPart)&lt;br/&gt;        {&lt;br/&gt;            Worksheet worksheet = worksheetPart.Worksheet;&lt;br/&gt;            SheetData sheetData = worksheet.GetFirstChild&lt;sheetdata&gt;();&lt;br/&gt;            string cellReference = columnName + rowIndex;&lt;br/&gt;&lt;br/&gt;            // If the worksheet does not contain a row with the specified row index, insert one.&lt;br/&gt;            Row row;&lt;br/&gt;            if (sheetData.Elements&lt;row&gt;().Where(r =&amp;gt; r.RowIndex == rowIndex).Count() != 0)&lt;br/&gt;            {&lt;br/&gt;                row = sheetData.Elements&lt;row&gt;().Where(r =&amp;gt; r.RowIndex == rowIndex).First();&lt;br/&gt;            }&lt;br/&gt;            else&lt;br/&gt;            {&lt;br/&gt;                row = new Row() { RowIndex = rowIndex };&lt;br/&gt;                sheetData.Append(row);&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            // If there is not a cell with the specified column name, insert one.  &lt;br/&gt;            if (row.Elements&lt;cell&gt;().Where(c =&amp;gt; c.CellReference.Value == columnName + rowIndex).Count() &amp;gt; 0)&lt;br/&gt;            {&lt;br/&gt;                return row.Elements&lt;cell&gt;().Where(c =&amp;gt; c.CellReference.Value == cellReference).First();&lt;br/&gt;            }&lt;br/&gt;            else&lt;br/&gt;            {&lt;br/&gt;                // Cells must be in sequential order according to CellReference. Determine where to insert the new cell.&lt;br/&gt;                Cell refCell = null;&lt;br/&gt;                foreach (Cell cell in row.Elements&lt;cell&gt;())&lt;br/&gt;                {&lt;br/&gt;                    if (string.Compare(cell.CellReference.Value, cellReference, true) &amp;gt; 0)&lt;br/&gt;                    {&lt;br/&gt;                        refCell = cell;&lt;br/&gt;                        break;&lt;br/&gt;                    }&lt;br/&gt;                }&lt;br/&gt;&lt;br/&gt;                Cell newCell = new Cell() { CellReference = cellReference };&lt;br/&gt;                row.InsertBefore(newCell, refCell);&lt;br/&gt;&lt;br/&gt;                worksheet.Save();&lt;br/&gt;                return newCell;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        private static WorksheetPart InsertWorksheet(WorkbookPart workbookPart)&lt;br/&gt;        {&lt;br/&gt;            // Add a new worksheet part to the workbook.&lt;br/&gt;            WorksheetPart newWorksheetPart = workbookPart.AddNewPart&lt;worksheetpart&gt;();&lt;br/&gt;            newWorksheetPart.Worksheet = new Worksheet(new SheetData());&lt;br/&gt;            newWorksheetPart.Worksheet.Save();&lt;br/&gt;&lt;br/&gt;            workbookPart.Workbook.AppendChild&lt;sheets&gt;(new Sheets());&lt;br/&gt;&lt;br/&gt;            Sheets sheets = workbookPart.Workbook.GetFirstChild&lt;sheets&gt;();&lt;br/&gt;            string relationshipId = workbookPart.GetIdOfPart(newWorksheetPart);&lt;br/&gt;&lt;br/&gt;            // Get a unique ID for the new sheet.&lt;br/&gt;            uint sheetId = 1;&lt;br/&gt;            if (sheets.Elements&lt;sheet&gt;().Count() &amp;gt; 0)&lt;br/&gt;            {&lt;br/&gt;                sheetId = sheets.Elements&lt;sheet&gt;().Select(s =&amp;gt; s.SheetId.Value).Max() + 1;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            string sheetName = "Sheet" + sheetId;&lt;br/&gt;&lt;br/&gt;            // Append the new worksheet and associate it with the workbook.&lt;br/&gt;            Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };&lt;br/&gt;            sheets.Append(sheet);&lt;br/&gt;&lt;br/&gt;            workbookPart.Workbook.Save();&lt;br/&gt;            return newWorksheetPart;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        // Given a Worksheet and a cell name, verifies that the specified cell exists.&lt;br/&gt;        // If it does not exist, creates a new cell. &lt;br/&gt;        private static void CreateSpreadsheetCellIfNotExist(Worksheet worksheet, string cellName)&lt;br/&gt;        {&lt;br/&gt;            string columnName = GetColumnName(cellName);&lt;br/&gt;            uint rowIndex = GetRowIndex(cellName);&lt;br/&gt;&lt;br/&gt;            IEnumerable&lt;row&gt; rows = worksheet.Descendants&lt;row&gt;().Where(r =&amp;gt; r.RowIndex.Value == rowIndex);&lt;br/&gt;&lt;br/&gt;            // If the Worksheet does not contain the specified row, create the specified row.&lt;br/&gt;            // Create the specified cell in that row, and insert the row into the Worksheet.&lt;br/&gt;            if (rows.Count() == 0)&lt;br/&gt;            {&lt;br/&gt;                Row row = new Row() { RowIndex = new UInt32Value(rowIndex) };&lt;br/&gt;                Cell cell = new Cell() { CellReference = new StringValue(cellName) };&lt;br/&gt;                row.Append(cell);&lt;br/&gt;                worksheet.Descendants&lt;sheetdata&gt;().First().Append(row);&lt;br/&gt;                worksheet.Save();&lt;br/&gt;            }&lt;br/&gt;            else&lt;br/&gt;            {&lt;br/&gt;                Row row = rows.First();&lt;br/&gt;&lt;br/&gt;                IEnumerable&lt;cell&gt; cells = row.Elements&lt;cell&gt;().Where(c =&amp;gt; c.CellReference.Value == cellName);&lt;br/&gt;&lt;br/&gt;                // If the row does not contain the specified cell, create the specified cell.&lt;br/&gt;                if (cells.Count() == 0)&lt;br/&gt;                {&lt;br/&gt;                    Cell cell = new Cell() { CellReference = new StringValue(cellName) };&lt;br/&gt;                    row.Append(cell);&lt;br/&gt;                    worksheet.Save();&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;        // Given a cell name, parses the specified cell to get the column name.&lt;br/&gt;        private static string GetColumnName(string cellName)&lt;br/&gt;        {&lt;br/&gt;            // Create a regular expression to match the column name portion of the cell name.&lt;br/&gt;            Regex regex = new Regex("[A-Za-z]+");&lt;br/&gt;            Match match = regex.Match(cellName);&lt;br/&gt;&lt;br/&gt;            return match.Value;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        // Given a cell name, parses the specified cell to get the row index.&lt;br/&gt;        private static uint GetRowIndex(string cellName)&lt;br/&gt;        {&lt;br/&gt;            // Create a regular expression to match the row index portion the cell name.&lt;br/&gt;            Regex regex = new Regex(@"\d+");&lt;br/&gt;            Match match = regex.Match(cellName);&lt;br/&gt;&lt;br/&gt;            return uint.Parse(match.Value);&lt;br/&gt;        }&lt;br/&gt;        &lt;br/&gt;        #endregion&lt;br/&gt;        #region Utility methods&lt;br/&gt;        private static string GetColumnName(int index)&lt;br/&gt;        {&lt;br/&gt;            string name = "";&lt;br/&gt;            char[] columnNames = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();&lt;br/&gt;            int num = index;&lt;br/&gt;            do&lt;br/&gt;            {&lt;br/&gt;                int i = num % 26;&lt;br/&gt;                name = columnNames[i] + name;&lt;br/&gt;                num = num / 26 - 1;&lt;br/&gt;            } while (num &amp;gt; -1);&lt;br/&gt;            if (string.IsNullOrEmpty(name))&lt;br/&gt;                name = "A";&lt;br/&gt;            return name;&lt;br/&gt;        } &lt;br/&gt;        #endregion&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;要使用上述代码，就可以用如下的一段代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;FileStream file = null;&lt;br/&gt;            OpenXMLExcel openXMLExcel = null;&lt;br/&gt;            try&lt;br/&gt;            {&lt;br/&gt;                file = new FileStream(@"C:\book1.xlsx", FileMode.Open);&lt;br/&gt;                openXMLExcel = new OpenXMLExcel(file, false);&lt;br/&gt;                openXMLExcel.WriteData(1, 1, "数学");&lt;br/&gt;                openXMLExcel.WriteData(3, 1, "物理");&lt;br/&gt;                openXMLExcel.InsertImage(1, 70, @"c:\TempPic.jpg");&lt;br/&gt;                openXMLExcel.Dispose();&lt;br/&gt;                file.Close();&lt;br/&gt;            }&lt;br/&gt;            catch&lt;br/&gt;            {&lt;br/&gt;                if (openXMLExcel != null)&lt;br/&gt;                {&lt;br/&gt;                    openXMLExcel.Dispose();&lt;br/&gt;                }&lt;br/&gt;                if (file != null)&lt;br/&gt;                {&lt;br/&gt;                    file.Close();&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            finally&lt;br/&gt;            {&lt;br/&gt;            }&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;FileMode.Open是为了读入已有的Excel文件的字节流。&lt;/p&gt;&lt;p&gt;new OpenXMLExcel(file, false)中的false是为了进行读取操作, 此参数如果为true的话，就会建立一个新的Excel Sheet。&lt;/p&gt;&lt;p&gt;openXMLExcel.WriteData(1, 1, "数学"); 是为了将“数学”两字写入黄色背景的单元格，前一个1是横向坐标参数，表示第1行，注意这是以单元格为单位的坐标，这个行号从0开始。后一个1是纵向组表参数，表示第一列，注意这个列号也是从0开始。即最左上的单元格的坐标是(0,0)。&lt;/p&gt;&lt;p&gt;openXMLExcel.InsertImage(1, 70, @"c:\TempPic.jpg"); 是为了将c:\TempPic.jpg插入到坐标为1, 70的坐标处。注意这是以象素Pixel为单位的坐标。坐标原点在左上角。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;OpenXML局限性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;此OpenXML不支持Excel 2003或者更早的文件格式。只支持Excel 2007及Excel 2010的文件格式。可能是因为从Excel 2007起，这些文件都用xml表示了。xlsx其实是一个zip文件，解开此zip文件，我们可以看到很多描述excel内容的xml文件。&lt;/p&gt;&lt;p&gt;Enjoy coding life!&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mikelij/aggbug/1971612.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mikelij/archive/2011/03/05/1971612.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mikelij/archive/2011/02/20/1959140.html</id><title type="text">Silverlight的数据验证Input validation</title><summary type="text">传统的验证方法开发应用程序最基本的的工作内容是进行数据验证。Silverlight的应用程序也不例外。Silverlight应用一定程度上类似于Windows Form应用。其数据验证可以用Winform传统的方法，如在准备提交时的代码中逐项检查数据的合法性。例如一个窗体中有若干输入框，和一个提交按钮。输入完毕后，点击提交按钮。我们可以在提交按钮Click事件处理程序中检查每个输入框的输入合法性。如果不合法，或者用一个弹出窗口提示用户，或者用别的一些方式（这些方式很多的，完全取决于UI设计），再之后就将光标停到有非法值的输入框，等待用户更正。例如下面的代码：cs代码：这个验证是检查学生姓名</summary><published>2011-02-20T09:23:00Z</published><updated>2011-02-20T09:23:00Z</updated><author><name>mikelij</name><uri>http://www.cnblogs.com/mikelij/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mikelij/archive/2011/02/20/1959140.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mikelij/archive/2011/02/20/1959140.html"/><content type="html">&lt;p&gt;&lt;strong&gt;传统的验证方法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;开发应用程序最基本的的工作内容是进行数据验证。Silverlight的应用程序也不例外。Silverlight应用一定程度上类似于Windows Form应用。其数据验证可以用Winform传统的方法，如在准备提交时的代码中逐项检查数据的合法性。例如一个窗体中有若干输入框，和一个提交按钮。输入完毕后，点击提交按钮。我们可以在提交按钮Click事件处理程序中检查每个输入框的输入合法性。如果不合法，或者用一个弹出窗口提示用户，或者用别的一些方式（这些方式很多的，完全取决于UI设计），再之后就将光标停到有非法值的输入框，等待用户更正。&lt;/p&gt;&lt;p&gt;例如下面的代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 679px; height: 498px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;UserControl&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;br /&gt;    xmlns:x&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    xmlns:navigation&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;br /&gt;    xmlns:uriMapper&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    xmlns:d&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://schemas.microsoft.com/expression/blend/2008"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; xmlns:mc&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://schemas.openxmlformats.org/markup-compatibility/2006"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;br /&gt;    xmlns:sdk&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    x:Class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="SilverlightApplication1.MainPage"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;br /&gt;    mc:Ignorable&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="d"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; d:DesignWidth&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="640"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; d:DesignHeight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="480"&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;Grid &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="480"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="grid1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="640"&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;sdk:Label &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="19"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="label1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="52"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="学生姓名"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalContentAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="32,113,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&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;TextBox &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="23"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="textBox1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="110"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="109,109,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalContentAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&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;Button &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="打印"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="24"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Click&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button1_Click"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="43,233,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="70"&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;ComboBox &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="24"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="109,147,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="comboBox1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="110"&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;ComboBoxItem &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="男"&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;ComboBoxItem &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="女"&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;ComboBox&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;sdk:Label &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="性别"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="19"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalContentAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="32,147,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="label2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="52"&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;sdk:Label &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="32"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="68,35,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="label3"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="141"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="学生档案管理"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; FontSize&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="16"&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;Button &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="保存"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="23"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="134,233,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Click&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button2_Click"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="75"&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;Grid&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;UserControl&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;cs代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 697px; height: 978px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Linq;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Net;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Controls;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Documents;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Input;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Media;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Media.Animation;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Navigation;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Shapes;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Printing;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; SilverlightApplication1&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; MainPage : UserControl&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; MainPage()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; pDoc_PrintPage(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, PrintPageEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            e.PageVisual &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;this&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;throw new NotImplementedException();&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&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;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; button1_Click(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, RoutedEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            PrintDocument pDoc &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; PrintDocument();&lt;br /&gt;            pDoc.PrintPage &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; EventHandler&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;PrintPageEventArgs&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(pDoc_PrintPage);&lt;br /&gt;            pDoc.Print(&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;span style="color: #000000;"&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&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;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; button2_Click(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, RoutedEventArgs e)&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; (textBox1.Text.Length &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;br /&gt;                MessageBox.Show(&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;span style="color: #000000;"&gt;);&lt;br /&gt;                textBox1.Focus();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&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;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; grid1_Loaded(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, RoutedEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            grid1.DataContext &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; StudentInfo();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这个验证是检查学生姓名是否输入了。如果没有输入就弹出一个消息窗口，要求输入学生姓名。如图：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722405230.png"&gt;&lt;img height="317" width="476" src="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722402971.png" alt="image" border="0" title="image" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;再之后将光标定位到学生姓名输入框。这是最传统的Winform输入验证。我们还是可以沿用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;用数据绑定的方式来验证数据&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;除了传统的方法之外，微软还提供了另外一种方式来实现数据合法性的验证，即：用客户端数据绑定来验证输入的数据。下面介绍一下。通过定义实现接口INotifyPropertyChanged的数据对象，来实现数据验证。&lt;/p&gt;&lt;p&gt;首先创建数据对象，这个数据对象必须有get和set。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 655px; height: 1134px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Net;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Controls;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Documents;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Ink;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Input;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Media;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Media.Animation;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Shapes;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; SilverlightApplication1&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; StudentInfo : INotifyPropertyChanged&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;event&lt;/span&gt;&lt;span style="color: #000000;"&gt; PropertyChangedEventHandler PropertyChanged &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;delegate&lt;/span&gt;&lt;span style="color: #000000;"&gt; { };&lt;br /&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;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; _name &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;/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;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt; _gender &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;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; Name&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; _name;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&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; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.IsNullOrEmpty(value))&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&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; ArgumentException(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Student Name is required.&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;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (value.Length &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;30&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&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; ArgumentException(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Student Name is too long.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                _name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; value;&lt;br /&gt;                OnPropertyChanged(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;name&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;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt; Gender&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; _gender;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            {&lt;br /&gt;                _gender &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; value;&lt;br /&gt;                OnPropertyChanged(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;gender&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;br /&gt;&lt;br /&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;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OnPropertyChanged(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; propertyName)&lt;br /&gt;        {&lt;br /&gt;            PropertyChanged(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&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; PropertyChangedEventArgs(propertyName));&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;编译一下。保证编译成功。这对后面的只能提示有用。切记。&lt;br /&gt;&lt;span face="微软雅黑" style="font-family: 微软雅黑;"&gt;XAML页面修改如下：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 681px; height: 556px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;UserControl&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;br /&gt;    xmlns:x&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    xmlns:navigation&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;br /&gt;    xmlns:uriMapper&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    xmlns:d&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://schemas.microsoft.com/expression/blend/2008"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; xmlns:mc&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://schemas.openxmlformats.org/markup-compatibility/2006"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;br /&gt;    xmlns:sdk&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; xmlns:local&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="clr-namespace:SilverlightApplication1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    x:Class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="SilverlightApplication1.MainPage"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;br /&gt;    mc:Ignorable&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="d"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; d:DesignWidth&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="640"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; d:DesignHeight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="480"&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;Grid &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="480"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="grid1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="640"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Loaded&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="grid1_Loaded"&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;Grid.DataContext&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;local:StudentInfo&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;Grid.DataContext&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;sdk:Label &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="19"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="label1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="52"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="学生姓名"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalContentAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="32,113,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&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;TextBox &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="23"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="textBox1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="110"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="109,109,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalContentAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="&lt;/span&gt;&lt;span style="color: #808000;"&gt;{Binding Mode=TwoWay, UpdateSourceTrigger=Explicit, NotifyOnValidationError=True, ValidatesOnExceptions=True, Path=Name}&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"&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;Button &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="打印"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="24"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Click&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button1_Click"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="43,233,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="70"&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;ComboBox &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="24"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="109,147,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="comboBox1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="110"&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;ComboBoxItem &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="男"&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;ComboBoxItem &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="女"&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;ComboBox&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;sdk:Label &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="性别"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="19"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalContentAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="32,147,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="label2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="52"&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;sdk:Label &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="32"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="68,35,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="label3"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="141"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="学生档案管理"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; FontSize&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="16"&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;Button &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="保存"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="23"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="134,233,0,0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; x:Name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Top"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Click&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button2_Click"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Left"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="75"&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;Grid&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;UserControl&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;p&gt;笔者看英文的书中介绍是用Express Blend来写黄色和蓝色背景部分。笔者试了一下，在Visual Studio里面似乎没有和Blend一样的操作界面。但是不想为了这个功能来装一个Blend。这里介绍一个只用Visual Studio就能实现的方法：&lt;/p&gt;&lt;p&gt;首先找到需要绑定的控件的容器，这里我们想把学生姓名绑定到textBox1，textBox1的容器是grid1。那么在这一行后回车：&lt;/p&gt;&lt;p&gt;输入&amp;lt;Grid.DataContext&amp;gt;，回车&lt;/p&gt;&lt;p&gt;再输入&amp;lt;local:，Visual Studio智能提示，我们从中选择StudentInfo，在输入/&amp;gt;。然后就成了：&lt;/p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 668px; height: 119px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;Grid.DataContext&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;local:StudentInfo&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;Grid.DataContext&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;p&gt;在容器添加数据上下文之后。在找到textBox1的Text属性。选&amp;rdquo;Appy Data Binding&amp;rdquo;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722412938.png"&gt;&lt;img height="260" width="569" src="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722424376.png" alt="image" border="0" title="image" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Source这一页，StudentInfo已经作为DataContext，什么都不用变。点Path页，&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722434343.png"&gt;&lt;img height="312" width="570" src="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722441703.png" alt="image" border="0" title="image" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;选择Name，这里没有Converter，就直接选择Options页。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722446130.png"&gt;&lt;img height="284" width="572" src="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722456031.png" alt="image" border="0" title="image" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Mode选TwoWay，UpdateSourceTrigger选：Explicit，勾选NotifiyOnValidationError，ValidatesOnExceptions, ValidateOnNotifyDataErrors。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722467950.png"&gt;&lt;img height="349" width="572" src="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722475800.png" alt="image" border="0" title="image" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;然后形成了上述XAML的蓝色背景部分。&lt;/p&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;p&gt;之后再选grid1，加入grid1_Loaded处理程序。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 640px; height: 155px;"&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; grid1_Loaded(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt;    grid1.DataContext &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; StudentInfo();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;p&gt;这是给grid1的DataContext初始化一个数据对象。&lt;/p&gt;&lt;p&gt;再在保存按钮的click时间处理程序中如此写：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 683px; height: 176px;"&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; button2_Click(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt;    var bindingExpression &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; textBox1.GetBindingExpression(TextBox.TextProperty);&lt;br /&gt;    bindingExpression.UpdateSource();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;/div&gt;&lt;p&gt;这是将textBox1的Text属性绑定到数据对象。&lt;br/&gt;至此，我们可以运行此程序看看效果。因我们现在用的方法是在Set中抛出Exception。不能用Debug模式运行。请用Debug-&amp;gt;Start without Debugging来启动程序。&lt;p&gt;姓名是必须输入的，试试不输入，直接点保存，姓名输入框会有一个红框：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722482735.png"&gt;&lt;img height="241" width="217" src="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722487370.png" alt="image" border="0" title="image" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;鼠标移到其右上角的小三角处。&lt;/p&gt;&lt;p&gt;数据对象中抛出的Exception信息就会显示出来：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722486257.png"&gt;&lt;img height="163" width="244" src="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722496224.png" alt="image" border="0" title="image" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;至此已经实现了一种根据数据对象绑定到Silverlight控件的数据验证方法。以上是在Set抛出例外的方法。&lt;/p&gt;&lt;p&gt;微软还为我们实现了一种DataAnnotation的机制。这样需要我们的工程引用System.ComponentModel.DataAnnotations.dll。还要加上：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 582px; height: 79px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel.DataAnnotations;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;如下代码：&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 597px; height: 372px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[Required(ErrorMessage &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;请输入学生姓名&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;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; Name&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; _name;&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    {&lt;br /&gt;        var validatorContext &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; ValidationContext(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&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;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        validatorContext.MemberName &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;Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        Validator.ValidateProperty(value, validatorContext);&lt;br /&gt;&lt;br /&gt;        _name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; value;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;又如加一个最长30个字符的限制：&lt;/pre&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 622px; height: 395px;"&gt;&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[Required(ErrorMessage &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;请输入学生姓名&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;[StringLength(&lt;/span&gt;&lt;span style="color: #800080;"&gt;30&lt;/span&gt;&lt;span style="color: #000000;"&gt;, ErrorMessage&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;最长30个字符&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;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; Name&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; _name;&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    {&lt;br /&gt;        var validatorContext &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; ValidationContext(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&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;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        validatorContext.MemberName &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;Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        Validator.ValidateProperty(value, validatorContext);&lt;br /&gt;&lt;br /&gt;        _name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; value;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722495111.png"&gt;&lt;img height="276" width="399" src="http://images.cnblogs.com/cnblogs_com/mikelij/201102/201102201722502537.png" alt="image" border="0" title="image" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/pre&gt;&lt;p&gt;以上是DataAnnotation方法来做输入验证。&lt;p&gt;&lt;strong&gt;Silverlight数据验证的安全性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;上面说了这么些数据验证方法。都是在客户端浏览器里运行的验证程序。都是不安全的。Silverlight程序就象Javascript程序一样在客户端浏览器中运行。黑客可以解开xap包，修改Silverlight程序。这和黑客可以绕过Javascript是一样的道理。所以基于Silverlight的系统，都必须在服务器端的WCF和web应用中加入严格的数据验证。才能真正保证安全。&lt;/p&gt;&lt;div class="mcePaste" id="_mcePaste" style="position: absolute; width: 1px; height: 1px; overflow: hidden; top: 0px; left: -10000px;"&gt;﻿&lt;/div&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/mikelij/aggbug/1959140.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mikelij/archive/2011/02/20/1959140.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
