<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_PetterLiu</title><subtitle type="text">Let the instinct guide you.</subtitle><id>http://feed.cnblogs.com/blog/u/18730/rss</id><updated>2012-01-21T07:47:53Z</updated><author><name>PetterLiu</name><uri>http://www.cnblogs.com/wintersun/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wintersun/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/18730/rss"/><entry><id>http://www.cnblogs.com/wintersun/archive/2012/01/21/2328563.html</id><title type="text">Asp.net MVC中的ViewData与ViewBag</title><summary type="text">在Asp.net MVC 3 web应用程序中，我们会用到ViewData与ViewBag，对比一下： ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net...</summary><published>2012-01-21T07:48:00Z</published><updated>2012-01-21T07:48:00Z</updated><author><name>PetterLiu</name><uri>http://www.cnblogs.com/wintersun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wintersun/archive/2012/01/21/2328563.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wintersun/archive/2012/01/21/2328563.html"/><content type="html">&lt;p&gt;在Asp.net MVC 3 web应用程序中，我们会用到&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.mvc.viewpage.viewdata.aspx" target="_blank"&gt;ViewData&lt;/a&gt;与&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbase.viewbag(v=vs.98).aspx" target="_blank"&gt;ViewBag&lt;/a&gt;，对比一下：     &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;table border="1" cellspacing="0" cellpadding="2" width="435"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="200"&gt;&lt;strong&gt;ViewData&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="233"&gt;&lt;strong&gt;ViewBag&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;它是Key/Value字典集合&lt;/td&gt;          &lt;td valign="top" width="233"&gt;它是&lt;a href="http://msdn.microsoft.com/en-us/library/dd264741.aspx" target="_blank"&gt;dynamic&lt;/a&gt;类型对像&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;从Asp.net MVC 1 就有了&lt;/td&gt;          &lt;td valign="top" width="233"&gt;ASP.NET MVC3 才有&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;基于Asp.net 3.5 framework&lt;/td&gt;          &lt;td valign="top" width="233"&gt;基于Asp.net 4.0与.net framework&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;ViewData比ViewBag快&lt;/td&gt;          &lt;td valign="top" width="233"&gt;ViewBag比ViewData慢&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;在ViewPage中查询数据时需要转换合适的类型&lt;/td&gt;          &lt;td valign="top" width="233"&gt;在ViewPage中查询数据时不需要类型转换&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;有一些类型转换代码&lt;/td&gt;          &lt;td valign="top" width="233"&gt;可读性更好&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;&lt;br /&gt;在Controller中使用ViewData:&lt;/p&gt;  &lt;pre &gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ActionResult &lt;/span&gt;UsingViewData()&#xD;
{&#xD;
    &#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;] = &lt;span style="color: #a31515"&gt;&amp;quot; Using ViewData&amp;quot;&lt;/span&gt;;&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;ProjectName&amp;quot;&lt;/span&gt;] = &lt;span style="color: #a31515"&gt;&amp;quot;My Test Project&amp;quot;&lt;/span&gt;;&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;ProjectDescription&amp;quot;&lt;/span&gt;] = &lt;span style="color: #a31515"&gt;&amp;quot;This is Test Project to demo Viewdata and viewbag details&amp;quot;&lt;/span&gt;;&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;StartDate&amp;quot;&lt;/span&gt;] = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;(2011, 1, 1);&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;TotalPrice&amp;quot;&lt;/span&gt;] = 1000;&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;TotalDays&amp;quot;&lt;/span&gt;] = 100;&#xD;
    &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; stackholder = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Client&amp;quot;&lt;/span&gt;,&lt;span style="color: #a31515"&gt;&amp;quot;Mr.  Client&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Manager&amp;quot;&lt;/span&gt;,&lt;span style="color: #a31515"&gt;&amp;quot;Mr. Joy&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Team Leader&amp;quot;&lt;/span&gt;,&lt;span style="color: #a31515"&gt;&amp;quot;Mr.Toy&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Sr. developer&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr.dojoy&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;developer&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr. nodoy&amp;quot;&lt;/span&gt;);&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;stackholder&amp;quot;&lt;/span&gt;] = stackholder;&#xD;
&#xD;
    &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; modules = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&#xD;
    modules.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Admin module&amp;quot;&lt;/span&gt;);&#xD;
    modules.Add(&lt;span style="color: #a31515"&gt;&amp;quot;ShoppingCart module&amp;quot;&lt;/span&gt;);&#xD;
    modules.Add(&lt;span style="color: #a31515"&gt;&amp;quot;CMS module&amp;quot;&lt;/span&gt;);&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;modules&amp;quot;&lt;/span&gt;] = modules;&#xD;
    &lt;span style="color: blue"&gt;return &lt;/span&gt;View();&#xD;
}&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;对应UsingViewData View的cshtml:&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;]&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
 &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;h2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Project Name : &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;ProjectName&amp;quot;&lt;/span&gt;]&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;h2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
     &lt;/span&gt;ProjectDescription :   &#xD;
     &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&amp;quot;&lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;ProjectDescription&amp;quot;&lt;/span&gt;]&amp;quot;.&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
      &lt;/span&gt;Stack Holder :&#xD;
      &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&#xD;
      &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;ul &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;stakholder&amp;quot;&amp;gt;&#xD;
      &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;( &lt;span style="color: blue"&gt;var &lt;/span&gt;stakerholder &lt;span style="color: blue"&gt;in &lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;stackholder&amp;quot;&lt;/span&gt;] &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; )&#xD;
      {          &#xD;
    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;stakerholder.Key &lt;span style="color: red"&gt;&amp;amp;nbsp; &lt;/span&gt;: &lt;span style="background: yellow"&gt;@&lt;/span&gt;stakerholder.Value&#xD;
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
      &lt;/span&gt;}&#xD;
     &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;ul&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
     &lt;/span&gt;Project Details:&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
     &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
       &lt;/span&gt;module List  :&#xD;
       &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;ul &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;modulelist&amp;quot;&amp;gt;&#xD;
      &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;( &lt;span style="color: blue"&gt;var &lt;/span&gt;module &lt;span style="color: blue"&gt;in &lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;modules&amp;quot;&lt;/span&gt;] &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; )&#xD;
      {          &#xD;
    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;module&#xD;
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
      &lt;/span&gt;}&#xD;
     &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;ul&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &#xD;
     &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
     &lt;/span&gt;Project StartDate : &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;StartDate&amp;quot;&lt;/span&gt;]  &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
     &lt;/span&gt;Project TotalPrice: &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;TotalPrice&amp;quot;&lt;/span&gt;] &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
     &lt;/span&gt;Project TotaDays  : &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;TotalDays&amp;quot;&lt;/span&gt;] &#xD;
   &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
 &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;然后是ViewBag:&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ActionResult &lt;/span&gt;UsingViewBag()&#xD;
{&#xD;
&#xD;
    ViewBag.Title = &lt;span style="color: #a31515"&gt;&amp;quot; Using ViewBag&amp;quot;&lt;/span&gt;;&#xD;
    ViewBag.ProjectName = &lt;span style="color: #a31515"&gt;&amp;quot;My Test Project&amp;quot;&lt;/span&gt;;&#xD;
    ViewBag.ProjectDescription = &lt;span style="color: #a31515"&gt;&amp;quot;This is Test Project to demo Viewdata and viewbag details&amp;quot;&lt;/span&gt;;&#xD;
    ViewBag.StartDate = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;(2011, 1, 1);&#xD;
    ViewBag.TotalPrice = 1000;&#xD;
    ViewBag.TotalDays = 100;&#xD;
    &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; stackholder = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Client&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr.  Client&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Manager&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr. Joy&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Team Leader&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr.Toy&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Sr. developer&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr.dojoy&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;developer&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr. nodoy&amp;quot;&lt;/span&gt;);&#xD;
    ViewBag.stackholder = stackholder;&#xD;
&#xD;
    &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; modules = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&#xD;
    modules.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Admin module&amp;quot;&lt;/span&gt;);&#xD;
    modules.Add(&lt;span style="color: #a31515"&gt;&amp;quot;ShoppingCart module&amp;quot;&lt;/span&gt;);&#xD;
    modules.Add(&lt;span style="color: #a31515"&gt;&amp;quot;CMS module&amp;quot;&lt;/span&gt;);&#xD;
    ViewBag.modules = modules;&#xD;
    &lt;span style="color: blue"&gt;return &lt;/span&gt;View();&#xD;
}&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;对应View UsingViewBag 的cshtml的ViewBag:&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewBag.Title&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
 &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;h2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Project Name : &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewBag.ProjectName&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;h2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
     &lt;/span&gt;ProjectDescription :   &#xD;
     &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&amp;quot;&lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewBag.ProjectDescription.&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
      &lt;/span&gt;Stack Holder :&#xD;
      &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&#xD;
      &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;ul &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;stakholder&amp;quot;&amp;gt;&#xD;
      &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;( &lt;span style="color: blue"&gt;var &lt;/span&gt;stakerholder &lt;span style="color: blue"&gt;in &lt;/span&gt;ViewBag.stackholder )&#xD;
      {          &#xD;
    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;stakerholder.Key &lt;span style="color: red"&gt;&amp;amp;nbsp; &lt;/span&gt;: &lt;span style="background: yellow"&gt;@&lt;/span&gt;stakerholder.Value&#xD;
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
      &lt;/span&gt;}&#xD;
     &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;ul&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
     &lt;/span&gt;Project Details:&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
     &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
       &lt;/span&gt;module List  :&#xD;
       &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;ul &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;modulelist&amp;quot;&amp;gt;&#xD;
      &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;( &lt;span style="color: blue"&gt;var &lt;/span&gt;module &lt;span style="color: blue"&gt;in &lt;/span&gt;ViewBag.modules )&#xD;
      {          &#xD;
    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;module&#xD;
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
      &lt;/span&gt;}&#xD;
     &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;ul&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &#xD;
     &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
     &lt;/span&gt;Project StartDate : &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewBag.StartDate.ToString(&lt;span style="color: #a31515"&gt;&amp;quot;dd-MMM-yyyy&amp;quot;&lt;/span&gt;) &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
     &lt;/span&gt;Project TotalPrice: &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewBag.TotalPrice  ₹  &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
     &lt;/span&gt;Project TotaDays  : &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewBag.TotalDays &#xD;
   &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
 &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;后面是在Controller中使用ViewBag:&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ActionResult &lt;/span&gt;UsingViewBagInControlAndViewDataInView()&#xD;
{&#xD;
&#xD;
    ViewBag.Title = &lt;span style="color: #a31515"&gt;&amp;quot; Using ViewBag In Control And ViewData In View&amp;quot;&lt;/span&gt;;&#xD;
    ViewBag.ProjectName = &lt;span style="color: #a31515"&gt;&amp;quot;My Test Project&amp;quot;&lt;/span&gt;;&#xD;
    ViewBag.ProjectDescription = &lt;span style="color: #a31515"&gt;&amp;quot;This is Test Project to demo Viewdata and viewbag details&amp;quot;&lt;/span&gt;;&#xD;
    ViewBag.StartDate = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;(2011, 1, 1);&#xD;
    ViewBag.TotalPrice = 1000;&#xD;
    ViewBag.TotalDays = 100;&#xD;
    &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; stackholder = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Client&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr.  Client&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Manager&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr. Joy&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Team Leader&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr.Toy&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Sr. developer&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr.dojoy&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;developer&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr. nodoy&amp;quot;&lt;/span&gt;);&#xD;
    ViewBag.stackholder = stackholder;&#xD;
&#xD;
    &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; modules = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&#xD;
    modules.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Admin module&amp;quot;&lt;/span&gt;);&#xD;
    modules.Add(&lt;span style="color: #a31515"&gt;&amp;quot;ShoppingCart module&amp;quot;&lt;/span&gt;);&#xD;
    modules.Add(&lt;span style="color: #a31515"&gt;&amp;quot;CMS module&amp;quot;&lt;/span&gt;);&#xD;
    ViewBag.modules = modules;&#xD;
    &lt;span style="color: blue"&gt;return &lt;/span&gt;View();&#xD;
}&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;在UsingViewBagInControlAndViewDataInView.cshtml中使用ViewData来取值：&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;]&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
 &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;h2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Project Name : &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;ProjectName&amp;quot;&lt;/span&gt;]&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;h2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
     &lt;/span&gt;ProjectDescription :   &#xD;
     &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&amp;quot;&lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;ProjectDescription&amp;quot;&lt;/span&gt;]&amp;quot;.&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
      &lt;/span&gt;Stack Holder :&#xD;
      &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&#xD;
      &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;ul &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;stakholder&amp;quot;&amp;gt;&#xD;
      &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;( &lt;span style="color: blue"&gt;var &lt;/span&gt;stakerholder &lt;span style="color: blue"&gt;in &lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;stackholder&amp;quot;&lt;/span&gt;] &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; )&#xD;
      {          &#xD;
    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;stakerholder.Key &lt;span style="color: red"&gt;&amp;amp;nbsp; &lt;/span&gt;: &lt;span style="background: yellow"&gt;@&lt;/span&gt;stakerholder.Value&#xD;
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
      &lt;/span&gt;}&#xD;
     &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;ul&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
     &lt;/span&gt;Project Details:&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
     &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
       &lt;/span&gt;module List  :&#xD;
       &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;ul &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;modulelist&amp;quot;&amp;gt;&#xD;
      &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;( &lt;span style="color: blue"&gt;var &lt;/span&gt;module &lt;span style="color: blue"&gt;in &lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;modules&amp;quot;&lt;/span&gt;] &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; )&#xD;
      {          &#xD;
    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;module&#xD;
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
      &lt;/span&gt;}&#xD;
     &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;ul&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &#xD;
     &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
     &lt;/span&gt;Project StartDate : &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;StartDate&amp;quot;&lt;/span&gt;]  &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
     &lt;/span&gt;Project TotalPrice: &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;TotalPrice&amp;quot;&lt;/span&gt;] &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
     &lt;/span&gt;Project TotaDays  : &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;TotalDays&amp;quot;&lt;/span&gt;] &#xD;
   &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
 &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;反过来是这样的: &#xD;
&#xD;
  &lt;br /&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ActionResult &lt;/span&gt;UsingViewDataInControlAndViewBagInView()&#xD;
{&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;] = &lt;span style="color: #a31515"&gt;&amp;quot; Using ViewData In Control And ViewBag In View&amp;quot;&lt;/span&gt;;&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;ProjectName&amp;quot;&lt;/span&gt;] = &lt;span style="color: #a31515"&gt;&amp;quot;My Test Project&amp;quot;&lt;/span&gt;;&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;ProjectDescription&amp;quot;&lt;/span&gt;] = &lt;span style="color: #a31515"&gt;&amp;quot;This is Test Project to demo Viewdata and viewbag details&amp;quot;&lt;/span&gt;;&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;StartDate&amp;quot;&lt;/span&gt;] = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;(2011, 1, 1);&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;TotalPrice&amp;quot;&lt;/span&gt;] = 1000;&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;TotalDays&amp;quot;&lt;/span&gt;] = 100;&#xD;
    &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; stackholder = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Client&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr.  Client&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Manager&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr. Joy&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Team Leader&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr.Toy&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Sr. developer&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr.dojoy&amp;quot;&lt;/span&gt;);&#xD;
    stackholder.Add(&lt;span style="color: #a31515"&gt;&amp;quot;developer&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Mr. nodoy&amp;quot;&lt;/span&gt;);&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;stackholder&amp;quot;&lt;/span&gt;] = stackholder;&#xD;
&#xD;
    &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; modules = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&#xD;
    modules.Add(&lt;span style="color: #a31515"&gt;&amp;quot;Admin module&amp;quot;&lt;/span&gt;);&#xD;
    modules.Add(&lt;span style="color: #a31515"&gt;&amp;quot;ShoppingCart module&amp;quot;&lt;/span&gt;);&#xD;
    modules.Add(&lt;span style="color: #a31515"&gt;&amp;quot;CMS module&amp;quot;&lt;/span&gt;);&#xD;
    ViewData[&lt;span style="color: #a31515"&gt;&amp;quot;modules&amp;quot;&lt;/span&gt;] = modules;&#xD;
    &lt;span style="color: blue"&gt;return &lt;/span&gt;View();&#xD;
}&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;在UsingViewDataInControlAndViewBagInView.cshtml 的View中使用ViewBag来取值:&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewBag.Title&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
 &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;h2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Project Name : &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewBag.ProjectName&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;h2&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
     &lt;/span&gt;ProjectDescription :   &#xD;
     &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&amp;quot;&lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewBag.ProjectDescription.&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
      &lt;/span&gt;Stack Holder :&#xD;
      &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
&#xD;
      &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;ul &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;stakholder&amp;quot;&amp;gt;&#xD;
      &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;( &lt;span style="color: blue"&gt;var &lt;/span&gt;stakerholder &lt;span style="color: blue"&gt;in &lt;/span&gt;ViewBag.stackholder )&#xD;
      {          &#xD;
    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;stakerholder.Key &lt;span style="color: red"&gt;&amp;amp;nbsp; &lt;/span&gt;: &lt;span style="background: yellow"&gt;@&lt;/span&gt;stakerholder.Value&#xD;
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
      &lt;/span&gt;}&#xD;
     &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;ul&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
   &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
     &lt;/span&gt;Project Details:&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
     &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
       &lt;/span&gt;module List  :&#xD;
       &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;ul &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;modulelist&amp;quot;&amp;gt;&#xD;
      &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;( &lt;span style="color: blue"&gt;var &lt;/span&gt;module &lt;span style="color: blue"&gt;in &lt;/span&gt;ViewBag.modules )&#xD;
      {          &#xD;
    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &lt;/span&gt;&lt;span style="background: yellow"&gt;@&lt;/span&gt;module&#xD;
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;li&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
      &lt;/span&gt;}&#xD;
     &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;ul&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &#xD;
     &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
     &lt;/span&gt;Project StartDate : &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewBag.StartDate.ToString(&lt;span style="color: #a31515"&gt;&amp;quot;dd-MMM-yyyy&amp;quot;&lt;/span&gt;) &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
     &lt;/span&gt;Project TotalPrice: &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewBag.TotalPrice  ₹  &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;br &lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&#xD;
     &lt;/span&gt;Project TotaDays  : &lt;span style="background: yellow"&gt;@&lt;/span&gt;ViewBag.TotalDays &#xD;
   &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
 &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;这样对比看上去会比较清楚一些。在源代码中的ViewBag是这样的属性:&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span style="color: blue"&gt;public dynamic &lt;/span&gt;ViewBag {&#xD;
    &lt;span style="color: blue"&gt;get &lt;/span&gt;{&#xD;
        &lt;span style="color: blue"&gt;if &lt;/span&gt;(_dynamicViewData == &lt;span style="color: blue"&gt;null&lt;/span&gt;) {&#xD;
            _dynamicViewData = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DynamicViewDataDictionary&lt;/span&gt;(() =&amp;gt; ViewData);&#xD;
        }&#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;_dynamicViewData;&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;ViewData是：&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ViewDataDictionary &lt;/span&gt;ViewData {&#xD;
    &lt;span style="color: blue"&gt;get &lt;/span&gt;{&#xD;
        &lt;span style="color: blue"&gt;if &lt;/span&gt;(_viewData == &lt;span style="color: blue"&gt;null&lt;/span&gt;) {&#xD;
            SetViewData(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ViewDataDictionary&lt;/span&gt;());&#xD;
        }&#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;_viewData;&#xD;
    }&#xD;
    &lt;span style="color: blue"&gt;set &lt;/span&gt;{&#xD;
        SetViewData(&lt;span style="color: blue"&gt;value&lt;/span&gt;);&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;具体细节在这儿不深入了，这里只是抛砖引玉。希望对您Asp.net MVC开发有帮助。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p id="AllanboltSignature"&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p style="border-bottom: #e0e0e0 1px dashed; border-left: #e0e0e0 1px dashed; padding-bottom: 10px; padding-left: 60px; padding-right: 10px; font-family: 微软雅黑; font-size: 12px; border-top: #e0e0e0 1px dashed; border-right: #e0e0e0 1px dashed; padding-top: 10px" id="PSignature"&gt;&lt;br /&gt;作者：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;Petter Liu&lt;/a&gt; &#xD;
&#xD;
  &lt;br /&gt;出处：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;http://www.cnblogs.com/wintersun/&lt;/a&gt; &#xD;
&#xD;
  &lt;br /&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 &#xD;
&#xD;
  &lt;br /&gt;该文章也同时发布在我的独立博客中-&lt;a href="http://www.cnblogs.com/wintersun/"&gt;Petter Liu Blog&lt;/a&gt;。 &lt;/p&gt;&lt;img src="http://www.cnblogs.com/wintersun/aggbug/2328563.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2012/01/21/2328563.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wintersun/archive/2012/01/21/2328421.html</id><title type="text">Asp.net MVC中使用Razor Generator实现View的单元测试</title><summary type="text">Asp.net MVC 3 应用程序中，单元测试对项目的质量意义重大。除了对Model，Controller进行单元测试，有时还需要对View也进行。对View进行测试目前并不容易做，大多数情况下可能做的是BlackBox测试。现在可以使用Razor Generator简化对Razor View单元测试。你可以从这里安装 VS2010的扩展。 然后在VIEW上右键属性，...</summary><published>2012-01-21T02:41:00Z</published><updated>2012-01-21T02:41:00Z</updated><author><name>PetterLiu</name><uri>http://www.cnblogs.com/wintersun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wintersun/archive/2012/01/21/2328421.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wintersun/archive/2012/01/21/2328421.html"/><content type="html">&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Asp.net MVC 3 应用程序中，单元测试对项目的质量意义重大。除了对Model，Controller进行单元测试，有时还需要对View也进行。对View进行测试目前并不容易做，大多数情况下可能做的是BlackBox测试。现在可以使用Razor Generator简化对Razor View单元测试。你可以从&lt;a href="http://visualstudiogallery.msdn.microsoft.com/1f6ec6ff-e89b-4c47-8e79-d2d68df894ec" target="_blank"&gt;这里安装&lt;/a&gt; VS2010的扩展。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 然后在VIEW上右键属性，对Custom Tool 使用Razor Generator，如下图，它就生成一个对应名称的Class, 文件与View在同一位置。   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://images.cnblogs.com/cnblogs_com/wintersun/201201/201201211040307976.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/wintersun/201201/201201211040317844.png" width="322" height="243" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;然后我们看这个Class是这样的:    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;pre &gt;[System.CodeDom.Compiler.&lt;span style="color: #2b91af"&gt;GeneratedCodeAttribute&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;RazorGenerator&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;1.3.0.0&amp;quot;&lt;/span&gt;)]&#xD;
    [System.Web.WebPages.&lt;span style="color: #2b91af"&gt;PageVirtualPathAttribute&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;~/Views/Home/TestViewInOutTime.cshtml&amp;quot;&lt;/span&gt;)]&#xD;
    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TestViewInOutTime &lt;/span&gt;: System.Web.Mvc.&lt;span style="color: #2b91af"&gt;WebViewPage&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;dynamic&lt;/span&gt;&amp;gt;&#xD;
    {&#xD;
        &lt;span style="color: blue"&gt;public &lt;/span&gt;TestViewInOutTime()&#xD;
        {&#xD;
        }&#xD;
        &lt;span style="color: blue"&gt;public override void &lt;/span&gt;Execute()&#xD;
        {&#xD;
&#xD;
            &#xD;
            &lt;span style="color: blue"&gt;#line &lt;/span&gt;1 &amp;quot;..\..\Views\Home\TestViewInOutTime.cshtml&amp;quot;&#xD;
  &#xD;
    Layout = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&#xD;
&#xD;
&#xD;
            &#xD;
            &lt;span style="color: blue"&gt;#line &lt;/span&gt;default&#xD;
            &lt;span style="color: blue"&gt;#line &lt;/span&gt;hidden&#xD;
WriteLiteral(&lt;span style="color: #a31515"&gt;&amp;quot;\r\n&amp;lt;!DOCTYPE html&amp;gt;\r\n\r\n&amp;lt;html&amp;gt;\r\n&amp;lt;head&amp;gt;\r\n    &amp;lt;title&amp;gt;TestViewInOutTime&amp;lt;/title&amp;gt;\r\n&amp;lt;/head&amp;quot; &lt;/span&gt;+&#xD;
&lt;span style="color: #a31515"&gt;&amp;quot;&amp;gt;\r\n&amp;lt;body&amp;gt;\r\n    &amp;lt;div&amp;gt;\r\n        &amp;lt;h1 id=\&amp;quot;titleOne\&amp;quot;&amp;gt;This is your life&amp;lt;/h1&amp;gt;\r\n    &amp;lt;/di&amp;quot; &lt;/span&gt;+&#xD;
&lt;span style="color: #a31515"&gt;&amp;quot;v&amp;gt;\r\n&amp;lt;/body&amp;gt;\r\n&amp;lt;/html&amp;gt;\r\n&amp;quot;&lt;/span&gt;);&#xD;
&#xD;
&#xD;
        }&#xD;
    }&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;这个View的内容是:&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span style="background: yellow"&gt;@{&#xD;
&lt;/span&gt;    Layout = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&#xD;
&lt;span style="background: yellow"&gt;}&#xD;
&#xD;
&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: maroon"&gt;DOCTYPE &lt;/span&gt;&lt;span style="color: red"&gt;html&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&#xD;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;html&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;head&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;TestViewInOutTime&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;head&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
        &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;h1 &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;titleOne&amp;quot;&amp;gt;&lt;/span&gt;This is your life&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;html&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&#xD;
&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;好的，接下来在你的单元测试项目中使用NuGet安装&lt;a href="http://nuget.org/packages/RazorGenerator.Testing" target="_blank"&gt;RazorGenerator.Testing&lt;/a&gt;, 它有下面的依赖组件同是安装: &#xD;
&#xD;
  &lt;br /&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
  &lt;p&gt;HtmlAgilityPack&lt;/p&gt;&#xD;
&#xD;
  &lt;p&gt;Moq&lt;/p&gt;&#xD;
&#xD;
  &lt;p&gt;ReflectionMagic&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;接着我们就可以写这样的单元测试代码。 &#xD;
&#xD;
  &lt;br /&gt;&#xD;
&#xD;
  &lt;br /&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;[&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]&#xD;
&lt;span style="color: blue"&gt;public void &lt;/span&gt;TestGetGivenIdInnerHtmlFromViews()&#xD;
{&#xD;
    &lt;span style="color: green"&gt;//arrange&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;views = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TestViewInOutTime&lt;/span&gt;();&#xD;
&#xD;
    &lt;span style="color: green"&gt;//act&#xD;
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HtmlDocument &lt;/span&gt;doc = views.RenderAsHtml();&#xD;
    &lt;span style="color: #2b91af"&gt;HtmlNode &lt;/span&gt;node = doc.GetElementbyId(&lt;span style="color: #a31515"&gt;&amp;quot;titleOne&amp;quot;&lt;/span&gt;);&#xD;
&#xD;
    &lt;span style="color: green"&gt;//assert&#xD;
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.IsNotNull(node);&#xD;
    &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: #a31515"&gt;&amp;quot;This is your life&amp;quot;&lt;/span&gt;, node.InnerHtml.Trim());&#xD;
}&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;上面的代码您可能看到把当前View Render以后是一个HtmlDocument，这是HtmlAgilityPack中的类。HtmlAgilityPack是一个解析HTML的类库。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;然后我们找到titleOne的结点比较的它的InnerHtml。那么对PartialView同样也可以：&#xD;
  &lt;br /&gt;&#xD;
&#xD;
  &lt;br /&gt;Tel.cshtml内容是这样的:&#xD;
&#xD;
  &lt;br /&gt;021-77677878&#xD;
&#xD;
  &lt;br /&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;代码是这样的:&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;[&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]&#xD;
&lt;span style="color: blue"&gt;public void &lt;/span&gt;TestPartialView()&#xD;
{&#xD;
    &lt;span style="color: green"&gt;//arrange&#xD;
    &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;views = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Tel&lt;/span&gt;();&#xD;
&#xD;
    &lt;span style="color: green"&gt;//act&#xD;
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HtmlDocument &lt;/span&gt;doc = views.RenderAsHtml();&#xD;
&#xD;
    &lt;span style="color: green"&gt;//assert&#xD;
    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.IsNotNull(doc);&#xD;
    &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: #a31515"&gt;&amp;quot;021-77677878&amp;quot;&lt;/span&gt;, doc.DocumentNode.InnerText);&#xD;
}&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;对Views的UnitTest本来就是棘手的事儿，因为View是在运行时编译的。但 Razor Generator 直接生成View类以方便我们测试它。那什么样产景下我们需要对View进行单元测试呢？有时我们没有必要比较整个输出的Html, 只需要比较是关键的某一段Html即可。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;希望对您开发有帮助。 &#xD;
  &lt;br /&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p id="AllanboltSignature"&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p style="border-bottom: #e0e0e0 1px dashed; border-left: #e0e0e0 1px dashed; padding-bottom: 10px; padding-left: 60px; padding-right: 10px; font-family: 微软雅黑; font-size: 12px; border-top: #e0e0e0 1px dashed; border-right: #e0e0e0 1px dashed; padding-top: 10px" id="PSignature"&gt;&lt;br /&gt;作者：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;Petter Liu&lt;/a&gt; &#xD;
&#xD;
  &lt;br /&gt;出处：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;http://www.cnblogs.com/wintersun/&lt;/a&gt; &#xD;
&#xD;
  &lt;br /&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 &#xD;
&#xD;
  &lt;br /&gt;该文章也同时发布在我的独立博客中-&lt;a href="http://www.cnblogs.com/wintersun/"&gt;Petter Liu Blog&lt;/a&gt;。 &lt;/p&gt;&lt;img src="http://www.cnblogs.com/wintersun/aggbug/2328421.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2012/01/21/2328421.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wintersun/archive/2012/01/07/2315588.html</id><title type="text">使用Moles框架实现HttpWebRequest与HttpWebResponse的单元测试</title><summary type="text">有时程序使用HttpWebRequest与HttpWebResponse实现HTTP的访问，但我们想测试它们不太容易实现。现在我们可以使用Moles框架来实现对它的单元测试。如果您还不了解Moles，可以先到官方网站看这个文档。下面我们来看片段代码: [TestMethod][HostType(&amp;quot;Moles&amp;quot;)][Description(&amp;quot;Testing with...</summary><published>2012-01-07T03:15:00Z</published><updated>2012-01-07T03:15:00Z</updated><author><name>PetterLiu</name><uri>http://www.cnblogs.com/wintersun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wintersun/archive/2012/01/07/2315588.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wintersun/archive/2012/01/07/2315588.html"/><content type="html">&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 有时程序使用&lt;a href="http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx" target="_blank"&gt;HttpWebRequest&lt;/a&gt;与&lt;a href="http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.aspx" target="_blank"&gt;HttpWebResponse&lt;/a&gt;实现HTTP的访问，但我们想测试它们不太容易实现。现在我们可以使用&lt;a href="http://research.microsoft.com/en-us/projects/pex/" target="_blank"&gt;Moles&lt;/a&gt;框架来实现对它的单元测试。如果您还不了解Moles，可以先到官方网站看这个&lt;a href="http://research.microsoft.com/en-us/projects/pex/molestutorial.docx" target="_blank"&gt;文档&lt;/a&gt;。下面我们来看片段代码:     &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;pre &gt;[&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]&#xD;
[&lt;span style="color: #2b91af"&gt;HostType&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Moles&amp;quot;&lt;/span&gt;)]&#xD;
[&lt;span style="color: #2b91af"&gt;Description&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Testing with moles assemblies&amp;quot;&lt;/span&gt;)]&#xD;
&lt;span style="color: blue"&gt;public void &lt;/span&gt;Get_KnownUrl_ReturnsExpectedValue()&#xD;
{&#xD;
    &lt;span style="color: blue"&gt;var &lt;/span&gt;mockedWebResponse = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MHttpWebResponse&lt;/span&gt;();&#xD;
    &lt;span style="color: #2b91af"&gt;MHttpWebRequest&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;AllInstances&lt;/span&gt;.GetResponse = (x) =&amp;gt;&#xD;
    {&#xD;
        &lt;span style="color: blue"&gt;return &lt;/span&gt;mockedWebResponse;&#xD;
    };&#xD;
&#xD;
    &lt;span style="color: blue"&gt;var &lt;/span&gt;googleUri = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;http://www.google.com&amp;quot;&lt;/span&gt;);&#xD;
    mockedWebResponse.StatusCodeGet = () =&amp;gt; { &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HttpStatusCode&lt;/span&gt;.OK; };&#xD;
    mockedWebResponse.ResponseUriGet = () =&amp;gt; { &lt;span style="color: blue"&gt;return &lt;/span&gt;googleUri; };&#xD;
    mockedWebResponse.ContentTypeGet = () =&amp;gt; { &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;testHttpResponse&amp;quot;&lt;/span&gt;; };&#xD;
&#xD;
    &lt;span style="color: blue"&gt;string &lt;/span&gt;mockedResponseStr = &lt;span style="color: #a31515"&gt;@&amp;quot;&amp;lt;html&amp;gt; \r\n&amp;quot; &lt;/span&gt;+&#xD;
                         &lt;span style="color: #a31515"&gt;&amp;quot;  &amp;lt;head&amp;gt;&amp;lt;/head&amp;gt; \r\n&amp;quot; &lt;/span&gt;+&#xD;
                         &lt;span style="color: #a31515"&gt;&amp;quot;  &amp;lt;body&amp;gt; \r\n&amp;quot; &lt;/span&gt;+&#xD;
                         &lt;span style="color: #a31515"&gt;&amp;quot;     &amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt; \r\n&amp;quot; &lt;/span&gt;+&#xD;
                         &lt;span style="color: #a31515"&gt;&amp;quot;  &amp;lt;/body&amp;gt; \r\n&amp;quot; &lt;/span&gt;+&#xD;
                         &lt;span style="color: #a31515"&gt;&amp;quot;&amp;lt;/html&amp;gt;&amp;quot;&lt;/span&gt;;&#xD;
&#xD;
    mockedWebResponse.ContentLengthGet = () =&amp;gt; { &lt;span style="color: blue"&gt;return &lt;/span&gt;mockedResponseStr.Length; };&#xD;
&#xD;
    &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;memoryStream = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt;())&#xD;
    {&#xD;
        &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;sw = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;StreamWriter&lt;/span&gt;(memoryStream))&#xD;
        {&#xD;
            sw.Write(mockedResponseStr);&#xD;
            sw.Flush();&#xD;
&#xD;
            memoryStream.Seek(0, &lt;span style="color: #2b91af"&gt;SeekOrigin&lt;/span&gt;.Begin);&#xD;
            mockedWebResponse.GetResponseStream = () =&amp;gt; memoryStream;&#xD;
&#xD;
&#xD;
            &lt;span style="color: green"&gt;//act&#xD;
            &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;request = &lt;span style="color: #2b91af"&gt;WebRequest&lt;/span&gt;.Create(&lt;span style="color: #a31515"&gt;&amp;quot;http://www.google.com&amp;quot;&lt;/span&gt;);&#xD;
            &lt;span style="color: blue"&gt;var &lt;/span&gt;response = (&lt;span style="color: #2b91af"&gt;HttpWebResponse&lt;/span&gt;)request.GetResponse();&#xD;
&#xD;
&#xD;
            &lt;span style="color: green"&gt;// Assert&#xD;
            &lt;/span&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;htmlContent = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&#xD;
            &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;streamReader = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;StreamReader&lt;/span&gt;(response.GetResponseStream()))&#xD;
            {&#xD;
                htmlContent = streamReader.ReadToEnd();&#xD;
            }&#xD;
&#xD;
            &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: #2b91af"&gt;HttpStatusCode&lt;/span&gt;.OK, response.StatusCode);&#xD;
            &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(mockedResponseStr.Length, response.ContentLength);&#xD;
            &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(mockedResponseStr, htmlContent);&#xD;
            &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(googleUri, response.ResponseUri);&#xD;
&#xD;
        }&#xD;
    }&#xD;
} &lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;上面的基于MsTest的代码引用Moles生成的System.Moles.dll，&lt;a href="http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx" target="_blank"&gt;HttpWebRequest&lt;/a&gt;与&lt;a href="http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.aspx" target="_blank"&gt;HttpWebResponse&lt;/a&gt;是在System.dll里的所以生成它。一开始对一些属性与方法的Mock操作，引用的是那些生成的MolesAssembiles，看字面意思可以了解代码的意图。接着模拟请求Google网站，返回我们遇先设置好返回的HtmlString，最后在验证中验证Stream,HttpStatusCode和Length是否一致。 当然您也可以测试其它属性成方法。注意最后请求的类是真实的类，可以演示我们把它们写在一起了。实际中可能是某个真实环境的API之类的方法。&#xD;
&#xD;
  &lt;br /&gt; &#xD;
&#xD;
  &lt;br /&gt;希望对您开发有帮助。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;您可以感兴趣的文章:&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2011/08/09/2132340.html"&gt;使用Moles对静态方法做UnitTest&lt;/a&gt; &#xD;
&#xD;
  &lt;br /&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p id="AllanboltSignature"&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p style="border-bottom: #e0e0e0 1px dashed; border-left: #e0e0e0 1px dashed; padding-bottom: 10px; padding-left: 60px; padding-right: 10px; font-family: 微软雅黑; font-size: 12px; border-top: #e0e0e0 1px dashed; border-right: #e0e0e0 1px dashed; padding-top: 10px" id="PSignature"&gt;&lt;br /&gt;作者：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;Petter Liu&lt;/a&gt; &#xD;
&#xD;
  &lt;br /&gt;出处：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;http://www.cnblogs.com/wintersun/&lt;/a&gt; &#xD;
&#xD;
  &lt;br /&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 &#xD;
&#xD;
  &lt;br /&gt;该文章也同时发布在我的独立博客中-&lt;a href="http://www.cnblogs.com/wintersun/"&gt;Petter Liu Blog&lt;/a&gt;。 &lt;/p&gt;&lt;img src="http://www.cnblogs.com/wintersun/aggbug/2315588.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2012/01/07/2315588.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wintersun/archive/2011/12/27/2303856.html</id><title type="text">.net中用Action等委托向外传递参数</title><summary type="text">一般我们可以使用ref,out达到向外传递参数目的。 Action&amp;lt;T&amp;gt;是一个特殊的委托，除了常规应用。我们还可以用它来实现简单地向外传递参数。直接看下面的UnitTest代码: 1: [TestMethod] 2: public void PassOutParametersUsingDelegate() 3: { 4: ...</summary><published>2011-12-27T10:16:00Z</published><updated>2011-12-27T10:16:00Z</updated><author><name>PetterLiu</name><uri>http://www.cnblogs.com/wintersun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wintersun/archive/2011/12/27/2303856.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wintersun/archive/2011/12/27/2303856.html"/><content type="html">&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 一般我们可以使用ref,out达到向外传递参数目的。 &lt;a href="http://msdn.microsoft.com/en-us/library/018hxwa8.aspx"&gt;Action&amp;lt;T&amp;gt;&lt;/a&gt;是一个特殊的委托，除了常规应用。我们还可以用它来实现简单地向外传递参数。直接看下面的UnitTest代码:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; [TestMethod]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PassOutParametersUsingDelegate()&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i = 0;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; messgae = &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;? addedNumber = 1;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color: #008000"&gt;//It is pass parameter by Action&amp;lt;T1,T2&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     Foo1((a, b) =&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;         i = a;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;         messgae = b;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;     });&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;     &lt;span style="color: #008000"&gt;//It is pass parameter by Func&amp;lt;T1,T2,TResult&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;     Foo2((a, b) =&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;         i = a;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;         messgae = b;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; addedNumber;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;     });&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;     Foo2((a, b) =&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; a+100;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;     });&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;     Assert.AreEqual(&lt;span style="color: #006080"&gt;&amp;quot;i=15,message=fifteen&amp;quot;&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;&amp;quot;i={0},message={1}&amp;quot;&lt;/span&gt;, i, messgae));&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Foo1(Action&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; action)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; number = 15;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; msg = &lt;span style="color: #006080"&gt;&amp;quot;fifteen&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum38"&gt;  38:&lt;/span&gt;     action(number, msg);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum39"&gt;  39:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum40"&gt;  40:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum41"&gt;  41:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Foo2(Func&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;?&amp;gt; func)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum42"&gt;  42:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum43"&gt;  43:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; number = 15;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum44"&gt;  44:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; msg = &lt;span style="color: #006080"&gt;&amp;quot;fifteen&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum45"&gt;  45:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum46"&gt;  46:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;? tempInt = func(number, msg);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum47"&gt;  47:&lt;/span&gt; } &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;上面的代码我们演示使用Action&amp;lt;T&amp;gt;, 有注意到我们把a,b两个值传递给方法外面的变量。同样的，我们用Func&amp;lt;TResult&amp;gt;可以实现。为什么会有这样的代码产生呢？源于这样的场景，有一个方法只有一个输入参数，返回void 。我们为了不改变原来这个方法参数签名，增加新的子方法，使用Action&amp;lt;T&amp;gt;向外传递参数。然后再用原方法Wrap新的子方法。 &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 关于Action&amp;lt;T&amp;gt;还有很多精彩的运用，&lt;a href="http://www.cnblogs.com/wintersun/archive/2009/05/10/1453796.html"&gt;Builder模式与Fluent接口&lt;/a&gt;。 &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 希望对您开发有帮助。 &#xD;
&#xD;
  &lt;br /&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p id="AllanboltSignature"&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p style="border-bottom: #e0e0e0 1px dashed; border-left: #e0e0e0 1px dashed; padding-bottom: 10px; padding-left: 60px; padding-right: 10px; font-family: 微软雅黑; font-size: 12px; border-top: #e0e0e0 1px dashed; border-right: #e0e0e0 1px dashed; padding-top: 10px" id="PSignature"&gt;&lt;br /&gt;作者：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;Petter Liu&lt;/a&gt; &#xD;
&#xD;
  &lt;br /&gt;出处：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;http://www.cnblogs.com/wintersun/&lt;/a&gt; &#xD;
&#xD;
  &lt;br /&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 &#xD;
&#xD;
  &lt;br /&gt;该文章也同时发布在我的独立博客中-&lt;a href="http://www.cnblogs.com/wintersun/"&gt;Petter Liu Blog&lt;/a&gt;。 &lt;/p&gt;&lt;img src="http://www.cnblogs.com/wintersun/aggbug/2303856.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2011/12/27/2303856.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wintersun/archive/2011/12/18/2291800.html</id><title type="text">Asp.net MVC3扩展之Ajax异常处理特性</title><summary type="text">在Asp.net MVC 3 Web开发中，我们会大量使用各种ajax请求，针对ajax请求如何结何server端如何做异常处理呢？我们可以扩展ActionFilterAttribute，实现一个Ajax异常处理特性。假设您是使用JQuery脚本开发来实现Ajax，看代码: 1: #region AjaxExceptionAttribute 2: /...</summary><published>2011-12-18T07:33:00Z</published><updated>2011-12-18T07:33:00Z</updated><author><name>PetterLiu</name><uri>http://www.cnblogs.com/wintersun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wintersun/archive/2011/12/18/2291800.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wintersun/archive/2011/12/18/2291800.html"/><content type="html">&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 在Asp.net MVC 3 Web开发中，我们会大量使用各种ajax请求，针对ajax请求如何结何server端如何做异常处理呢？我们可以扩展ActionFilterAttribute，实现一个Ajax异常处理特性。假设您是使用JQuery脚本开发来实现Ajax，看代码:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#region&lt;/span&gt; AjaxExceptionAttribute&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// Ajax Exception Handle Attribute&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AjaxExceptionAttribute : ActionFilterAttribute, IExceptionFilter&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// Called when an exception occurs.&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;filterContext&amp;quot;&amp;gt;The filter context.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnException(ExceptionContext filterContext)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!filterContext.HttpContext.Request.IsAjaxRequest()) &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;         filterContext.Result = AjaxError(filterContext.Exception.Message, filterContext);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//Let the system know that the exception has been handled&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;         filterContext.ExceptionHandled = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// Ajaxes the error.&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;message&amp;quot;&amp;gt;The message.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;filterContext&amp;quot;&amp;gt;The filter context.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;JsonResult&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; JsonResult AjaxError(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; message, ExceptionContext filterContext)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//If message is null or empty, then fill with generic message&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (String.IsNullOrEmpty(message))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;             message = &lt;span style="color: #006080"&gt;&amp;quot;Something went wrong while processing your request. Please refresh the page and try again.&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//Set the response status code to 500&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;         filterContext.HttpContext.Response.StatusCode = (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;)HttpStatusCode.InternalServerError;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum38"&gt;  38:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//Needed for IIS7.0&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum39"&gt;  39:&lt;/span&gt;         filterContext.HttpContext.Response.TrySkipIisCustomErrors = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum40"&gt;  40:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum41"&gt;  41:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; JsonResult&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum42"&gt;  42:&lt;/span&gt;         {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum43"&gt;  43:&lt;/span&gt;             &lt;span style="color: #008000"&gt;//can extend more properties &lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum44"&gt;  44:&lt;/span&gt;             Data = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AjaxExceptionModel () { ErrorMessage = message },&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum45"&gt;  45:&lt;/span&gt;             ContentEncoding = System.Text.Encoding.UTF8,&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum46"&gt;  46:&lt;/span&gt;             JsonRequestBehavior = JsonRequestBehavior.DenyGet&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum47"&gt;  47:&lt;/span&gt;         };&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum48"&gt;  48:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum49"&gt;  49:&lt;/span&gt; } &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum50"&gt;  50:&lt;/span&gt; &lt;span style="color: #cc6633"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum51"&gt;  51:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum52"&gt;  52:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum53"&gt;  53:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// AjaxExceptionModel&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum54"&gt;  54:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum55"&gt;  55:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AjaxExceptionModel&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum56"&gt;  56:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum57"&gt;  57:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum58"&gt;  58:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// Gets or sets the error message.&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum59"&gt;  59:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum60"&gt;  60:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;value&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum61"&gt;  61:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// The error message.&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum62"&gt;  62:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum63"&gt;  63:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ErrorMessage { get; set; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum64"&gt;  64:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;代码已有相关注释。AjaxExceptionModel您完全可以自定义更多的属性，然后在Controller或Action上增加这个特性。 像下面这个HomeController有一个YouKnow的Action，这里为演示我们故意throw一个Exception:&lt;/p&gt;&#xD;
&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
  &lt;div id="codeSnippetWrapper"&gt;&#xD;
    &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;[AjaxException]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; HomeController : BaseController&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;[HttpPost]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult YouKnow(FormCollection fc)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #006080"&gt;&amp;quot;YouKnow method: fc should not be null&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
  &lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;接下来看HTML与JQuery:&lt;/p&gt;&#xD;
&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
  &lt;div id="codeSnippetWrapper"&gt;&#xD;
    &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;h4&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;lblMethodError&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;h4&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;h4&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;lblMethodSuccess&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;h4&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;h2&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;ajax post&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;h2&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;input&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Post method&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;inputajax1&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;input&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Ajax method with error section&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;inputajax2&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&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;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;input&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Post method for undefined Url&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;inputajax3&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&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;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&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;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;input&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Post method to get Json Result&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;inputajax4&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&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;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;h3&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;errorh3info&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;h3&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
  &lt;/div&gt;&#xD;
&#xD;
  &lt;br /&gt;JQuery的全局AjaxError配置，可参考&lt;a href="http://api.jquery.com/ajaxError/"&gt;官方&lt;/a&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$(&lt;span style="color: #006080"&gt;&amp;quot;#errorh3info&amp;quot;&lt;/span&gt;).ajaxError(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;event&lt;/span&gt;, request, settings) {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;).append(&lt;span style="color: #006080"&gt;&amp;quot;&amp;lt;li&amp;gt;settings.url:&amp;quot;&lt;/span&gt; + settings.url + &lt;span style="color: #006080"&gt;&amp;quot;&amp;lt;/li&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;).append(&lt;span style="color: #006080"&gt;&amp;quot;&amp;lt;li&amp;gt;request.status:&amp;quot;&lt;/span&gt; + request.status + &lt;span style="color: #006080"&gt;&amp;quot;&amp;lt;/li&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;).append(&lt;span style="color: #006080"&gt;&amp;quot;&amp;lt;li&amp;gt;request.statusText:&amp;quot;&lt;/span&gt; + request.statusText + &lt;span style="color: #006080"&gt;&amp;quot;&amp;lt;/li&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #008000"&gt;//request.responseText&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (request.responseText != &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;) {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; jsonValue = jQuery.parseJSON(request.responseText);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;).append(&lt;span style="color: #006080"&gt;&amp;quot;&amp;lt;li&amp;gt;ErrorMessage:&amp;quot;&lt;/span&gt; + jsonValue.ErrorMessage + &lt;span style="color: #006080"&gt;&amp;quot;&amp;lt;/li&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;});&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;给button增加一个Post请求：&lt;/p&gt;&#xD;
&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$(&lt;span style="color: #006080"&gt;'#inputajax1'&lt;/span&gt;).click(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$.post(&lt;span style="color: #006080"&gt;'/Home/YouKnow/'&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;, { id: 1 }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;, &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (data) {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$(&lt;span style="color: #006080"&gt;'div#right-box.data'&lt;/span&gt;).html(data);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;});&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;});&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;这时View上将显示, 我们将看到ErrorMessage是JSON对象的属性：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;&#xD;
  &lt;li&gt;settings.url:/Home/YouKnow/ &lt;/li&gt;&#xD;
&#xD;
  &lt;li&gt;request.status:500 &lt;/li&gt;&#xD;
&#xD;
  &lt;li&gt;request.statusText:error &lt;/li&gt;&#xD;
&#xD;
  &lt;li&gt;ErrorMessage:Value cannot be null. Parameter name: YouKnow method: fc should not be null &#xD;
    &lt;p&gt;&lt;font size="2"&gt;&#xD;
        &lt;br /&gt;当然也可以这样: &#xD;
&#xD;
        &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
  &lt;/li&gt;&#xD;
&#xD;
  &lt;li&gt;&#xD;
    &lt;div id="codeSnippetWrapper"&gt;&#xD;
      &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #008000"&gt;//ajax post when throw an exception at server side&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$(&lt;span style="color: #006080"&gt;'#inputajax2'&lt;/span&gt;).click(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$.ajax({&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;type: &lt;span style="color: #006080"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;url: &lt;span style="color: #006080"&gt;&amp;quot;/Home/YouKnow2&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;data: &lt;span style="color: #006080"&gt;&amp;quot;fail=1&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;dataType: &lt;span style="color: #006080"&gt;&amp;quot;json&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;error: &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (xhr, status, error) {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #008000"&gt;// Show the error&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$(&lt;span style="color: #006080"&gt;'#lblMethodError'&lt;/span&gt;).append(xhr.responseText);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$(&lt;span style="color: #006080"&gt;'#lblMethodError'&lt;/span&gt;).show();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;},&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;success: &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (data, textSuccess) {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #008000"&gt;// show the success message&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$(&lt;span style="color: #006080"&gt;'#lblMethodSuccess'&lt;/span&gt;).show();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;});&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;});&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
    &lt;/div&gt;&#xD;
&#xD;
    &lt;p&gt;&lt;br /&gt;这时View上，比上面那个请求多显示一条信息, 这是因为我们这里定义了自己error处理callback.&#xD;
&#xD;
      &lt;br /&gt;&lt;/p&gt;&#xD;
  &lt;/li&gt;&#xD;
&#xD;
  &lt;li&gt;&#xD;
    &lt;p&gt;&lt;strong&gt;{&amp;quot;ErrorMessage&amp;quot;:&amp;quot;Value cannot be null.\r\nParameter name: YouKnow method: fc should not be null&amp;quot;}&#xD;
      &lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
    &lt;p&gt;当我们请求一个不存在Action时呢: &#xD;
      &lt;br /&gt;&lt;/p&gt;&#xD;
&#xD;
    &lt;div id="codeSnippetWrapper"&gt;&#xD;
      &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #008000"&gt;//request undefined url&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$(&lt;span style="color: #006080"&gt;'#inputajax3'&lt;/span&gt;).click(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; () {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$.post(&lt;span style="color: #006080"&gt;'/Home/YouKnow2233/'&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;, { id: 1 }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;, &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (data) {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;$(&lt;span style="color: #006080"&gt;'div#right-box.data'&lt;/span&gt;).html(data);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;});&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;});&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
    &lt;/div&gt;&#xD;
&#xD;
    &lt;p&gt;&lt;br /&gt;页面上将显示：&lt;/p&gt;&#xD;
&#xD;
    &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
  &lt;/li&gt;&#xD;
&#xD;
  &lt;li&gt;settings.url:/Home/YouKnow2233/ &lt;/li&gt;&#xD;
&#xD;
  &lt;li&gt;request.status:0 &lt;/li&gt;&#xD;
&#xD;
  &lt;li&gt;request.statusText:error &lt;/li&gt;&#xD;
&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;最后我们来看这个ActionFilter的单元测试，这里使用&lt;a href="http://code.google.com/p/moq/"&gt;Moq&lt;/a&gt;类库: &#xD;
&#xD;
  &lt;br /&gt;&#xD;
&#xD;
  &lt;br /&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;[TestMethod]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Test_Native_AjaxExceptionAttribute()&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #008000"&gt;//arrange&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; header = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.Collections.Specialized.NameValueCollection();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;header.Add(&lt;span style="color: #006080"&gt;&amp;quot;X-Requested-With&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;XMLHttpRequest&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; mockRequest = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Mock&amp;lt;HttpRequestBase&amp;gt;();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;mockRequest.SetupGet(http =&amp;gt; http.Headers).Returns(header);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; mockResponse = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Mock&amp;lt;HttpResponseBase&amp;gt;();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; mockHttpContext = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Mock&amp;lt;HttpContextBase&amp;gt;();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;mockHttpContext.SetupGet(c =&amp;gt; c.Request).Returns(mockRequest.Object);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;mockHttpContext.SetupGet(c =&amp;gt; c.Response).Returns(mockResponse.Object);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; context = mockHttpContext.Object;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; exceptonContextMock = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Mock&amp;lt;ExceptionContext&amp;gt;();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;exceptonContextMock.SetupGet(ac =&amp;gt; ac.HttpContext).Returns(context);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; errorStr=&lt;span style="color: #006080"&gt;&amp;quot;error&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;exceptonContextMock.SetupGet(ec =&amp;gt; ec.Exception).Returns(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AggregateException(errorStr));&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #008000"&gt;//act&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; ajaxAttribute = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AjaxExceptionAttribute();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; exceptionContext = exceptonContextMock.Object;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;ajaxAttribute.OnException(exceptionContext);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #008000"&gt;//verify&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;mockRequest.VerifyAll();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;mockResponse.VerifyAll();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;mockHttpContext.VerifyAll();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;exceptonContextMock.VerifyAll();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #008000"&gt;//assert&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; jsonResult = exceptionContext.Result &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; JsonResult;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;Assert.IsNotNull(jsonResult.Data);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;Assert.IsTrue(exceptionContext.HttpContext.Request.IsAjaxRequest());&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;Assert.AreEqual((jsonResult.Data &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; AjaxExceptionModel).ErrorMessage, errorStr);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;Assert.AreEqual(JsonRequestBehavior.DenyGet, jsonResult.JsonRequestBehavior);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;Assert.AreEqual(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(AggregateException), exceptionContext.Exception.GetType());&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;} &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;上面的UnitTest我们Mock HttpContext,HttpRequest,HttpResponse来实现对ActionFilter的测试。 &#xD;
&#xD;
  &lt;br /&gt;希望您Web开发有帮助。 &#xD;
&#xD;
  &lt;br /&gt;&#xD;
&#xD;
  &lt;br /&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p id="AllanboltSignature"&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p style="border-bottom: #e0e0e0 1px dashed; border-left: #e0e0e0 1px dashed; padding-bottom: 10px; padding-left: 60px; padding-right: 10px; font-family: 微软雅黑; font-size: 12px; border-top: #e0e0e0 1px dashed; border-right: #e0e0e0 1px dashed; padding-top: 10px" id="PSignature"&gt;&lt;br /&gt;作者：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;Petter Liu&lt;/a&gt; &#xD;
&#xD;
  &lt;br /&gt;出处：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;http://www.cnblogs.com/wintersun/&lt;/a&gt; &#xD;
&#xD;
  &lt;br /&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 &#xD;
&#xD;
  &lt;br /&gt;该文章也同时发布在我的独立博客中-&lt;a href="http://www.cnblogs.com/wintersun/"&gt;Petter Liu Blog&lt;/a&gt;。 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;img src="http://www.cnblogs.com/wintersun/aggbug/2291800.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2011/12/18/2291800.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wintersun/archive/2011/12/09/2282675.html</id><title type="text">Asp.net MVC 3 防止 Cross-Site Request Forgery (CSRF)原理及扩展</title><summary type="text">Cross-Site Request Forgery (CSRF) 是我们Web站点中常见的安全隐患。 下面我们在Asp.net MVC3 来演示一下。 例如我们有一个HomeContoller中一个Submit Action，我们标记了Http Post[HttpPost]public ActionResult Submit(FormCollection fc){ if (!string.IsNullOrEmpty(fc[&amp;quot;Title&amp;quot;])) { ViewBag.Message = &amp;quot;Submit success!&amp;quot;; return View(&amp;quo</summary><published>2011-12-09T12:23:00Z</published><updated>2011-12-09T12:23:00Z</updated><author><name>PetterLiu</name><uri>http://www.cnblogs.com/wintersun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wintersun/archive/2011/12/09/2282675.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wintersun/archive/2011/12/09/2282675.html"/><content type="html">&lt;p&gt;Cross-Site Request Forgery (CSRF) 是我们Web站点中常见的安全隐患。 下面我们在Asp.net MVC3 来演示一下。 例如我们有一个HomeContoller中一个Submit Action，我们标记了Http Post&lt;/p&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&#xD;
&lt;pre&gt;[HttpPost]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Submit(FormCollection fc)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(fc[&lt;span style="color: #006080;"&gt;"Title"&lt;/span&gt;]))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;ViewBag.Message = &lt;span style="color: #006080;"&gt;"Submit success!"&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color: #006080;"&gt;"Index"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color: #006080;"&gt;"Error"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在View 使用Razor 简单提交是这样：&lt;/p&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&#xD;
&lt;pre&gt;@&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (Html.BeginForm(&lt;span style="color: #006080;"&gt;"Submit"&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"Home"&lt;/span&gt;))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;@Html.TextBox(&lt;span style="color: #006080;"&gt;"Title"&lt;/span&gt;,&lt;span style="color: #006080;"&gt;"text"&lt;/span&gt;);               &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&amp;lt;input type=&lt;span style="color: #006080;"&gt;"submit"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #006080;"&gt;"Submit"&lt;/span&gt; id=&lt;span style="color: #006080;"&gt;"sb1"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;点击这个Button我们就提交表单了，接下来我们轻易使用Fiddler来伪造这个Http Post请求:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/wintersun/201112/201112092022122827.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/wintersun/201112/201112092022132403.png" alt="image" width="354" height="343" border="0" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;然后提交，成功了，返回 OK. &lt;/p&gt;&#xD;
&lt;p&gt;POST &lt;a href="http://localhost:55181/Home/Submit"&gt;http://localhost:55181/Home/Submit&lt;/a&gt;&amp;nbsp; HTTP/1.1 &lt;br /&gt;User-Agent: Fiddler &lt;br /&gt;Host: localhost:55181 &lt;br /&gt;Content-Length: 10&lt;/p&gt;&#xD;
&lt;p&gt;Title=text&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;那在Asp.net MVC 3 Web Application中如何防止呢？在View中使用&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;@Html.AntiForgeryToken()&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;这时当Web应用程序运行时，查看生成HTML，你会看到form标签后有一个hidden input标签 &lt;/p&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;form&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;action&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="/Home/Submit2"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;method&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="post"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="__RequestVerificationToken"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="hidden"&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="WiB+H5TNp6V27ALYB3z/1nkD9BLaZIBbWQOBEllj2R/+MkGZqOjLbIof2MJeEoyUJV2ljujNR4etYV6idzji&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;G4+JL77P9qmeewc4Erh8LnMBHX6zLas2L67GDhvCom0dpiDZl0cH+PykIC/R+HYzEIUTK/thXuF8OUtLwIfKdly0650U&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;3I7MD6/cIc5aersJBMZ/p6gv76gc6nvKJDt2w0eMy3tkEfAcnNPTdeWr59Ns+48gsGpZ2GSh6G+Uh7rb" &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Title"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Title"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;        &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="submit"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Submit"&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="sb1"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;看源代码是GetHtml方法序列化相应值生成的，&lt;/p&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; HtmlString GetHtml(HttpContextBase httpContext, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; salt, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; domain, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; path)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;Debug.Assert(httpContext != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; formValue = GetAntiForgeryTokenAndSetCookie(httpContext, salt, domain, path);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; fieldName = AntiForgeryData.GetAntiForgeryTokenName(&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;TagBuilder builder = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TagBuilder(&lt;span style="color: #006080;"&gt;"input"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;builder.Attributes[&lt;span style="color: #006080;"&gt;"type"&lt;/span&gt;] = &lt;span style="color: #006080;"&gt;"hidden"&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;builder.Attributes[&lt;span style="color: #006080;"&gt;"name"&lt;/span&gt;] = fieldName;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;builder.Attributes[&lt;span style="color: #006080;"&gt;"value"&lt;/span&gt;] = formValue;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HtmlString(builder.ToString(TagRenderMode.SelfClosing));&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;同时还写Cookies&lt;/p&gt;&#xD;
&lt;p&gt;&lt;code&gt;__RequestVerificationToken_Lw__=T37bfAdCkz0o1iXbAvH4v0bdpGQxfZP2PI5aTJgLL&lt;/code&gt;&lt;code&gt;/Yhr3128FUY+fvUPApBqz7CGd2uxPiW+lsZ5tvRbeLSetARbHGxPRqiw4LZiPpWrpU9XY8NO4aZzNAdMe+l3q5EMw2iIFB/6UfriWxD7X7n&lt;/code&gt;&lt;code&gt;/8P43LJ4tkGgv6BbrGWmKFo= &lt;br /&gt; &lt;br /&gt;更多细节，请查询源代码。然后在Action上增加 [ValidateAntiForgeryToken] 就可以了，它是这样工作的: &lt;br /&gt; &lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Validate(HttpContextBase context, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; salt) {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;     Debug.Assert(context != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; fieldName = AntiForgeryData.GetAntiForgeryTokenName(&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; cookieName = AntiForgeryData.GetAntiForgeryTokenName(context.Request.ApplicationPath);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;     HttpCookie cookie = context.Request.Cookies[cookieName];&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (cookie == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt; || String.IsNullOrEmpty(cookie.Value)) {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum9" style="color: #606060;"&gt;   9:&lt;/span&gt;         &lt;span style="color: #008000;"&gt;// error: cookie token is missing&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum10" style="color: #606060;"&gt;  10:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; CreateValidationException();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum11" style="color: #606060;"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum12" style="color: #606060;"&gt;  12:&lt;/span&gt;     AntiForgeryData cookieToken = Serializer.Deserialize(cookie.Value);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum13" style="color: #606060;"&gt;  13:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum14" style="color: #606060;"&gt;  14:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; formValue = context.Request.Form[fieldName];&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum15" style="color: #606060;"&gt;  15:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (String.IsNullOrEmpty(formValue)) {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum16" style="color: #606060;"&gt;  16:&lt;/span&gt;         &lt;span style="color: #008000;"&gt;// error: form token is missing&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum17" style="color: #606060;"&gt;  17:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; CreateValidationException();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum18" style="color: #606060;"&gt;  18:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum19" style="color: #606060;"&gt;  19:&lt;/span&gt;     AntiForgeryData formToken = Serializer.Deserialize(formValue);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum20" style="color: #606060;"&gt;  20:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum21" style="color: #606060;"&gt;  21:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!String.Equals(cookieToken.Value, formToken.Value, StringComparison.Ordinal)) {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum22" style="color: #606060;"&gt;  22:&lt;/span&gt;         &lt;span style="color: #008000;"&gt;// error: form token does not match cookie token&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum23" style="color: #606060;"&gt;  23:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; CreateValidationException();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum24" style="color: #606060;"&gt;  24:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum25" style="color: #606060;"&gt;  25:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum26" style="color: #606060;"&gt;  26:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; currentUsername = AntiForgeryData.GetUsername(context.User);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum27" style="color: #606060;"&gt;  27:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!String.Equals(formToken.Username, currentUsername, StringComparison.OrdinalIgnoreCase)) {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum28" style="color: #606060;"&gt;  28:&lt;/span&gt;         &lt;span style="color: #008000;"&gt;// error: form token is not valid for this user&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum29" style="color: #606060;"&gt;  29:&lt;/span&gt;         &lt;span style="color: #008000;"&gt;// (don't care about cookie token)&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum30" style="color: #606060;"&gt;  30:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; CreateValidationException();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum31" style="color: #606060;"&gt;  31:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum32" style="color: #606060;"&gt;  32:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum33" style="color: #606060;"&gt;  33:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!String.Equals(salt ?? String.Empty, formToken.Salt, StringComparison.Ordinal)) {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum34" style="color: #606060;"&gt;  34:&lt;/span&gt;         &lt;span style="color: #008000;"&gt;// error: custom validation failed&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum35" style="color: #606060;"&gt;  35:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; CreateValidationException();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum36" style="color: #606060;"&gt;  36:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum37" style="color: #606060;"&gt;  37:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;br /&gt;从Cookie中获得之前序列化存入的Token，然后反序列化与表单提交的Token进行对比。 接着，又对当前请求的用户认证进行确认。 最后看有没有设置Salt，有的话再进行比较。其中有一步验证没有通过，则throw异常。 &lt;br /&gt;有时的需求是这样的，我们需要使用Session验证用户，那么我们可在上面方法修改增加下面的代码块,意图是对比之前Session值是否与当前认证后Session值相等： &lt;br /&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//verify session &lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!String.Equals(formToken.SessionId, AntiForgeryData.GetGUIDString(), StringComparison.Ordinal))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; CreateValidationException();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;在修改AntiForgeryDataSerializer类，它负责序列化，这里我们增加了SessionId属性:&amp;nbsp;&lt;br /&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; AntiForgeryDataSerializer&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;   {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;       [SuppressMessage(&lt;span style="color: #006080;"&gt;"Microsoft.Usage"&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"CA2202:Do not dispose objects multiple times"&lt;/span&gt;, Justification = &lt;span style="color: #006080;"&gt;"MemoryStream is resilient to double-Dispose"&lt;/span&gt;)]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;       &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; AntiForgeryData Deserialize(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; serializedToken)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;       {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;           &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (String.IsNullOrEmpty(serializedToken))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;           {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt;               &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ArgumentException(&lt;span style="color: #006080;"&gt;"Argument_Cannot_Be_Null_Or_Empty"&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"serializedToken"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum9" style="color: #606060;"&gt;   9:&lt;/span&gt;           }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum10" style="color: #606060;"&gt;  10:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum11" style="color: #606060;"&gt;  11:&lt;/span&gt;           &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum12" style="color: #606060;"&gt;  12:&lt;/span&gt;           {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum13" style="color: #606060;"&gt;  13:&lt;/span&gt;               &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (MemoryStream stream = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MemoryStream(Decoder(serializedToken)))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum14" style="color: #606060;"&gt;  14:&lt;/span&gt;               &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (BinaryReader reader = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; BinaryReader(stream))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum15" style="color: #606060;"&gt;  15:&lt;/span&gt;               {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum16" style="color: #606060;"&gt;  16:&lt;/span&gt;                   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AntiForgeryData&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum17" style="color: #606060;"&gt;  17:&lt;/span&gt;                   {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum18" style="color: #606060;"&gt;  18:&lt;/span&gt;                       Salt = reader.ReadString(),&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum19" style="color: #606060;"&gt;  19:&lt;/span&gt;                       Value = reader.ReadString(),&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum20" style="color: #606060;"&gt;  20:&lt;/span&gt;                       CreationDate = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime(reader.ReadInt64()),&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum21" style="color: #606060;"&gt;  21:&lt;/span&gt;                       Username = reader.ReadString(),&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum22" style="color: #606060;"&gt;  22:&lt;/span&gt;                       SessionId=reader.ReadString()&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum23" style="color: #606060;"&gt;  23:&lt;/span&gt;                   };&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum24" style="color: #606060;"&gt;  24:&lt;/span&gt;               }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum25" style="color: #606060;"&gt;  25:&lt;/span&gt;           }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum26" style="color: #606060;"&gt;  26:&lt;/span&gt;           &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum27" style="color: #606060;"&gt;  27:&lt;/span&gt;           {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum28" style="color: #606060;"&gt;  28:&lt;/span&gt;               &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; System.Web.Mvc.HttpAntiForgeryException(&lt;span style="color: #006080;"&gt;"AntiForgeryToken_ValidationFailed"&lt;/span&gt;, ex);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum29" style="color: #606060;"&gt;  29:&lt;/span&gt;           }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum30" style="color: #606060;"&gt;  30:&lt;/span&gt;       }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum31" style="color: #606060;"&gt;  31:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum32" style="color: #606060;"&gt;  32:&lt;/span&gt;       [SuppressMessage(&lt;span style="color: #006080;"&gt;"Microsoft.Usage"&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"CA2202:Do not dispose objects multiple times"&lt;/span&gt;, Justification = &lt;span style="color: #006080;"&gt;"MemoryStream is resilient to double-Dispose"&lt;/span&gt;)]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum33" style="color: #606060;"&gt;  33:&lt;/span&gt;       &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Serialize(AntiForgeryData token)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum34" style="color: #606060;"&gt;  34:&lt;/span&gt;       {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum35" style="color: #606060;"&gt;  35:&lt;/span&gt;           &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (token == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum36" style="color: #606060;"&gt;  36:&lt;/span&gt;           {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum37" style="color: #606060;"&gt;  37:&lt;/span&gt;               &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #006080;"&gt;"token"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum38" style="color: #606060;"&gt;  38:&lt;/span&gt;           }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum39" style="color: #606060;"&gt;  39:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum40" style="color: #606060;"&gt;  40:&lt;/span&gt;           &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (MemoryStream stream = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MemoryStream())&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum41" style="color: #606060;"&gt;  41:&lt;/span&gt;           &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (BinaryWriter writer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; BinaryWriter(stream))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum42" style="color: #606060;"&gt;  42:&lt;/span&gt;           {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum43" style="color: #606060;"&gt;  43:&lt;/span&gt;               writer.Write(token.Salt);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum44" style="color: #606060;"&gt;  44:&lt;/span&gt;               writer.Write(token.Value);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum45" style="color: #606060;"&gt;  45:&lt;/span&gt;               writer.Write(token.CreationDate.Ticks);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum46" style="color: #606060;"&gt;  46:&lt;/span&gt;               writer.Write(token.Username);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum47" style="color: #606060;"&gt;  47:&lt;/span&gt;               writer.Write(token.SessionId);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum48" style="color: #606060;"&gt;  48:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum49" style="color: #606060;"&gt;  49:&lt;/span&gt;               &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Encoder(stream.ToArray());&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum50" style="color: #606060;"&gt;  50:&lt;/span&gt;           }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum51" style="color: #606060;"&gt;  51:&lt;/span&gt;       }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum52" style="color: #606060;"&gt;  52:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在View这样使用,并引入Salt，这使得我们安全机制又提升了一点儿。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&#xD;
&lt;pre&gt;@&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (Html.BeginForm(&lt;span style="color: #006080;"&gt;"Submit2"&lt;/span&gt;, &lt;span style="color: #006080;"&gt;"Home"&lt;/span&gt;))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;@Html.AntiForgeryToken(DebugMvc.Controllers.Config.SALT);                          &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;@Html.TextBox(&lt;span style="color: #006080;"&gt;"Title"&lt;/span&gt;,&lt;span style="color: #006080;"&gt;"text"&lt;/span&gt;);                  &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&amp;lt;br /&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&amp;lt;input type=&lt;span style="color: #006080;"&gt;"submit"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #006080;"&gt;"Submit"&lt;/span&gt; id=&lt;span style="color: #006080;"&gt;"sb1"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;Action的特性上，我们也配置对应的Salt字符串: &lt;/p&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&#xD;
&lt;pre&gt;[HttpPost]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;[ValidateAntiForgeryToken(Salt = Config.SALT)]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Submit2(FormCollection fc)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(fc[&lt;span style="color: #006080;"&gt;"Title"&lt;/span&gt;]))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;ViewBag.Message = &lt;span style="color: #006080;"&gt;"Submit success!"&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color: #006080;"&gt;"Index"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color: #006080;"&gt;"Error"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;配置类:&lt;br /&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Config&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; SALT = &lt;span style="color: #006080;"&gt;"Why you are here"&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这个实现一个简单的Session在HttpModule中, &lt;/p&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; MySessionModule:IHttpModule&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #cc6633;"&gt;#region&lt;/span&gt; IHttpModule Members&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Dispose(){}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Init(HttpApplication context)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;context.AcquireRequestState += &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; EventHandler(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.AcquireRequestState);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #cc6633;"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; AcquireRequestState(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;HttpApplication httpApp = (HttpApplication)sender;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (httpApp.Context.CurrentHandler &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; IRequiresSessionState)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (httpApp.Session.IsNewSession)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;httpApp.Session[&lt;span style="color: #006080;"&gt;"GUID"&lt;/span&gt;] = Guid.NewGuid();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这时我们再使用Fiddler模拟请求POST到这个Action,后得到下面的结果，这个异常信息也是可以修改的:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;AntiForgeryToken_ValidationFailed&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Description: &lt;/strong&gt;An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. &lt;br /&gt;&lt;strong&gt;Exception Details: &lt;/strong&gt;System.Web.Mvc.HttpAntiForgeryException: AntiForgeryToken_ValidationFailed&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;最后让我们来看单元测试的代码:&lt;/p&gt;&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; DebugMvc.Ut&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; Microsoft.VisualStudio.TestTools.UnitTesting;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; DebugMvc.Controllers;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum9" style="color: #606060;"&gt;   9:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum10" style="color: #606060;"&gt;  10:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; Moq;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum11" style="color: #606060;"&gt;  11:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Specialized;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum12" style="color: #606060;"&gt;  12:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; Match = System.Text.RegularExpressions.Match;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum13" style="color: #606060;"&gt;  13:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Text.RegularExpressions;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum14" style="color: #606060;"&gt;  14:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Globalization;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum15" style="color: #606060;"&gt;  15:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum16" style="color: #606060;"&gt;  16:&lt;/span&gt;     [TestClass]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum17" style="color: #606060;"&gt;  17:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; UnitTestForAll&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum18" style="color: #606060;"&gt;  18:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum19" style="color: #606060;"&gt;  19:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; _antiForgeryTokenCookieName = AntiForgeryData.GetAntiForgeryTokenName(&lt;span style="color: #006080;"&gt;"/SomeAppPath"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum20" style="color: #606060;"&gt;  20:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; _serializedValuePrefix = &lt;span style="color: #006080;"&gt;@"&amp;lt;input name="&lt;/span&gt;&lt;span style="color: #006080;"&gt;"__RequestVerificationToken"&lt;/span&gt;&lt;span style="color: #006080;"&gt;" type="&lt;/span&gt;&lt;span style="color: #006080;"&gt;"hidden"&lt;/span&gt;&lt;span style="color: #006080;"&gt;" value="&lt;/span&gt;&lt;span style="color: #006080;"&gt;"Creation: "&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum21" style="color: #606060;"&gt;  21:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; _someValueSuffix = &lt;span style="color: #006080;"&gt;@", Value: some value, Salt: some other salt, Username: username"&lt;/span&gt;&lt;span style="color: #006080;"&gt;" /&amp;gt;"&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum22" style="color: #606060;"&gt;  22:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; Regex _randomFormValueSuffixRegex = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #006080;"&gt;@", Value: (?&amp;lt;value&amp;gt;[A-Za-z0-9/\+=]{24}), Salt: some other salt, Username: username"&lt;/span&gt;&lt;span style="color: #006080;"&gt;" /&amp;gt;$"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum23" style="color: #606060;"&gt;  23:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; Regex _randomCookieValueSuffixRegex = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #006080;"&gt;@", Value: (?&amp;lt;value&amp;gt;[A-Za-z0-9/\+=]{24}), Salt: "&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum24" style="color: #606060;"&gt;  24:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum25" style="color: #606060;"&gt;  25:&lt;/span&gt;         [TestMethod]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum26" style="color: #606060;"&gt;  26:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; TestValidateAntiForgeryToken2Attribute()&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum27" style="color: #606060;"&gt;  27:&lt;/span&gt;         {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum28" style="color: #606060;"&gt;  28:&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//arrange&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum29" style="color: #606060;"&gt;  29:&lt;/span&gt;             var mockHttpContext = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Mock&amp;lt;HttpContextBase&amp;gt;();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum30" style="color: #606060;"&gt;  30:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum31" style="color: #606060;"&gt;  31:&lt;/span&gt;             var context = mockHttpContext.Object;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum32" style="color: #606060;"&gt;  32:&lt;/span&gt;             var authorizationContextMock = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Mock&amp;lt;AuthorizationContext&amp;gt;();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum33" style="color: #606060;"&gt;  33:&lt;/span&gt;             authorizationContextMock.SetupGet(ac =&amp;gt; ac.HttpContext).Returns(context);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum34" style="color: #606060;"&gt;  34:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum35" style="color: #606060;"&gt;  35:&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; validateCalled = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum36" style="color: #606060;"&gt;  36:&lt;/span&gt;             Action&amp;lt;HttpContextBase, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt; validateMethod = (c, s) =&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum37" style="color: #606060;"&gt;  37:&lt;/span&gt;             {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum38" style="color: #606060;"&gt;  38:&lt;/span&gt;                 Assert.AreSame(context, c);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum39" style="color: #606060;"&gt;  39:&lt;/span&gt;                 Assert.AreEqual(&lt;span style="color: #006080;"&gt;"some salt"&lt;/span&gt;, s);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum40" style="color: #606060;"&gt;  40:&lt;/span&gt;                 validateCalled = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum41" style="color: #606060;"&gt;  41:&lt;/span&gt;             };&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum42" style="color: #606060;"&gt;  42:&lt;/span&gt;             var attribute = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ValidateAntiForgeryToken2Attribute(validateMethod)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum43" style="color: #606060;"&gt;  43:&lt;/span&gt;             {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum44" style="color: #606060;"&gt;  44:&lt;/span&gt;                 Salt = &lt;span style="color: #006080;"&gt;"some salt"&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum45" style="color: #606060;"&gt;  45:&lt;/span&gt;             };&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum46" style="color: #606060;"&gt;  46:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum47" style="color: #606060;"&gt;  47:&lt;/span&gt;             &lt;span style="color: #008000;"&gt;// Act&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum48" style="color: #606060;"&gt;  48:&lt;/span&gt;             attribute.OnAuthorization(authorizationContextMock.Object);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum49" style="color: #606060;"&gt;  49:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum50" style="color: #606060;"&gt;  50:&lt;/span&gt;             &lt;span style="color: #008000;"&gt;// Assert&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum51" style="color: #606060;"&gt;  51:&lt;/span&gt;             Assert.IsTrue(validateCalled);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum52" style="color: #606060;"&gt;  52:&lt;/span&gt;         }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum53" style="color: #606060;"&gt;  53:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum54" style="color: #606060;"&gt;  54:&lt;/span&gt;         [TestMethod]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum55" style="color: #606060;"&gt;  55:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; GetHtml_ReturnsFormFieldAndSetsCookieValueIfDoesNotExist()&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum56" style="color: #606060;"&gt;  56:&lt;/span&gt;         {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum57" style="color: #606060;"&gt;  57:&lt;/span&gt;             &lt;span style="color: #008000;"&gt;// Arrange&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum58" style="color: #606060;"&gt;  58:&lt;/span&gt;             AntiForgeryWorker worker = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AntiForgeryWorker()&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum59" style="color: #606060;"&gt;  59:&lt;/span&gt;             {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum60" style="color: #606060;"&gt;  60:&lt;/span&gt;                 Serializer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DummyAntiForgeryTokenSerializer()&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum61" style="color: #606060;"&gt;  61:&lt;/span&gt;             };&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum62" style="color: #606060;"&gt;  62:&lt;/span&gt;             var context = CreateContext();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum63" style="color: #606060;"&gt;  63:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum64" style="color: #606060;"&gt;  64:&lt;/span&gt;             &lt;span style="color: #008000;"&gt;// Act&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum65" style="color: #606060;"&gt;  65:&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; formValue = worker.GetHtml(context, &lt;span style="color: #006080;"&gt;"some other salt"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;).ToHtmlString();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum66" style="color: #606060;"&gt;  66:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum67" style="color: #606060;"&gt;  67:&lt;/span&gt;             &lt;span style="color: #008000;"&gt;// Assert&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum68" style="color: #606060;"&gt;  68:&lt;/span&gt;             Assert.IsTrue(formValue.StartsWith(_serializedValuePrefix), &lt;span style="color: #006080;"&gt;"Form value prefix did not match."&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum69" style="color: #606060;"&gt;  69:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum70" style="color: #606060;"&gt;  70:&lt;/span&gt;             Match formMatch = _randomFormValueSuffixRegex.Match(formValue);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum71" style="color: #606060;"&gt;  71:&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; formTokenValue = formMatch.Groups[&lt;span style="color: #006080;"&gt;"value"&lt;/span&gt;].Value;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum72" style="color: #606060;"&gt;  72:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum73" style="color: #606060;"&gt;  73:&lt;/span&gt;             HttpCookie cookie = context.Response.Cookies[_antiForgeryTokenCookieName];&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum74" style="color: #606060;"&gt;  74:&lt;/span&gt;             Assert.IsNotNull(cookie, &lt;span style="color: #006080;"&gt;"Cookie was not set correctly."&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum75" style="color: #606060;"&gt;  75:&lt;/span&gt;             Assert.IsTrue(cookie.HttpOnly, &lt;span style="color: #006080;"&gt;"Cookie should have HTTP-only flag set."&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum76" style="color: #606060;"&gt;  76:&lt;/span&gt;             Assert.IsTrue(String.IsNullOrEmpty(cookie.Domain), &lt;span style="color: #006080;"&gt;"Domain should not have been set."&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum77" style="color: #606060;"&gt;  77:&lt;/span&gt;             Assert.AreEqual(&lt;span style="color: #006080;"&gt;"/"&lt;/span&gt;, cookie.Path, &lt;span style="color: #006080;"&gt;"Path should have remained at '/' by default."&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum78" style="color: #606060;"&gt;  78:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum79" style="color: #606060;"&gt;  79:&lt;/span&gt;             Match cookieMatch = _randomCookieValueSuffixRegex.Match(cookie.Value);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum80" style="color: #606060;"&gt;  80:&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; cookieTokenValue = cookieMatch.Groups[&lt;span style="color: #006080;"&gt;"value"&lt;/span&gt;].Value;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum81" style="color: #606060;"&gt;  81:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum82" style="color: #606060;"&gt;  82:&lt;/span&gt;             Assert.AreEqual(formTokenValue, cookieTokenValue, &lt;span style="color: #006080;"&gt;"Form and cookie token values did not match."&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum83" style="color: #606060;"&gt;  83:&lt;/span&gt;         }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum84" style="color: #606060;"&gt;  84:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum85" style="color: #606060;"&gt;  85:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; HttpContextBase CreateContext(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; cookieValue = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; formValue = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; username = &lt;span style="color: #006080;"&gt;"username"&lt;/span&gt;)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum86" style="color: #606060;"&gt;  86:&lt;/span&gt;         {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum87" style="color: #606060;"&gt;  87:&lt;/span&gt;             HttpCookieCollection requestCookies = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HttpCookieCollection();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum88" style="color: #606060;"&gt;  88:&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!String.IsNullOrEmpty(cookieValue))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum89" style="color: #606060;"&gt;  89:&lt;/span&gt;             {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum90" style="color: #606060;"&gt;  90:&lt;/span&gt;                 requestCookies.Set(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HttpCookie(_antiForgeryTokenCookieName, cookieValue));&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum91" style="color: #606060;"&gt;  91:&lt;/span&gt;             }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum92" style="color: #606060;"&gt;  92:&lt;/span&gt;             NameValueCollection formCollection = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; NameValueCollection();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum93" style="color: #606060;"&gt;  93:&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!String.IsNullOrEmpty(formValue))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum94" style="color: #606060;"&gt;  94:&lt;/span&gt;             {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum95" style="color: #606060;"&gt;  95:&lt;/span&gt;                 formCollection.Set(AntiForgeryData.GetAntiForgeryTokenName(&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;), formValue);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum96" style="color: #606060;"&gt;  96:&lt;/span&gt;             }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum97" style="color: #606060;"&gt;  97:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum98" style="color: #606060;"&gt;  98:&lt;/span&gt;             Mock&amp;lt;HttpContextBase&amp;gt; mockContext = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Mock&amp;lt;HttpContextBase&amp;gt;();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum99" style="color: #606060;"&gt;  99:&lt;/span&gt;             mockContext.Setup(c =&amp;gt; c.Request.ApplicationPath).Returns(&lt;span style="color: #006080;"&gt;"/SomeAppPath"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum100" style="color: #606060;"&gt; 100:&lt;/span&gt;             mockContext.Setup(c =&amp;gt; c.Request.Cookies).Returns(requestCookies);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum101" style="color: #606060;"&gt; 101:&lt;/span&gt;             mockContext.Setup(c =&amp;gt; c.Request.Form).Returns(formCollection);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum102" style="color: #606060;"&gt; 102:&lt;/span&gt;             mockContext.Setup(c =&amp;gt; c.Response.Cookies).Returns(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HttpCookieCollection());&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum103" style="color: #606060;"&gt; 103:&lt;/span&gt;             mockContext.Setup(c =&amp;gt; c.User.Identity.IsAuthenticated).Returns(&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum104" style="color: #606060;"&gt; 104:&lt;/span&gt;             mockContext.Setup(c =&amp;gt; c.User.Identity.Name).Returns(username);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum105" style="color: #606060;"&gt; 105:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum106" style="color: #606060;"&gt; 106:&lt;/span&gt;             var sessionmock = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Mock&amp;lt;HttpSessionStateBase&amp;gt;();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum107" style="color: #606060;"&gt; 107:&lt;/span&gt;             sessionmock.Setup(s =&amp;gt; s[&lt;span style="color: #006080;"&gt;"GUID"&lt;/span&gt;]).Returns(Guid.NewGuid().ToString());&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum108" style="color: #606060;"&gt; 108:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum109" style="color: #606060;"&gt; 109:&lt;/span&gt;             mockContext.Setup(c =&amp;gt; c.Session).Returns(sessionmock.Object);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum110" style="color: #606060;"&gt; 110:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum111" style="color: #606060;"&gt; 111:&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; mockContext.Object;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum112" style="color: #606060;"&gt; 112:&lt;/span&gt;         }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum113" style="color: #606060;"&gt; 113:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum114" style="color: #606060;"&gt; 114:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum115" style="color: #606060;"&gt; 115:&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; DummyAntiForgeryTokenSerializer : AntiForgeryDataSerializer&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum116" style="color: #606060;"&gt; 116:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum117" style="color: #606060;"&gt; 117:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Serialize(AntiForgeryData token)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum118" style="color: #606060;"&gt; 118:&lt;/span&gt;         {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum119" style="color: #606060;"&gt; 119:&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; String.Format(CultureInfo.InvariantCulture, &lt;span style="color: #006080;"&gt;"Creation: {0}, Value: {1}, Salt: {2}, Username: {3}"&lt;/span&gt;,&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum120" style="color: #606060;"&gt; 120:&lt;/span&gt;                     token.CreationDate, token.Value, token.Salt, token.Username);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum121" style="color: #606060;"&gt; 121:&lt;/span&gt;         }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum122" style="color: #606060;"&gt; 122:&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; AntiForgeryData Deserialize(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; serializedToken)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum123" style="color: #606060;"&gt; 123:&lt;/span&gt;         {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum124" style="color: #606060;"&gt; 124:&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (serializedToken == &lt;span style="color: #006080;"&gt;"invalid"&lt;/span&gt;)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum125" style="color: #606060;"&gt; 125:&lt;/span&gt;             {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum126" style="color: #606060;"&gt; 126:&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HttpAntiForgeryException();&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum127" style="color: #606060;"&gt; 127:&lt;/span&gt;             }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum128" style="color: #606060;"&gt; 128:&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] parts = serializedToken.Split(&lt;span style="color: #006080;"&gt;':'&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum129" style="color: #606060;"&gt; 129:&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AntiForgeryData()&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum130" style="color: #606060;"&gt; 130:&lt;/span&gt;             {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum131" style="color: #606060;"&gt; 131:&lt;/span&gt;                 CreationDate = DateTime.Parse(parts[0], CultureInfo.InvariantCulture),&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum132" style="color: #606060;"&gt; 132:&lt;/span&gt;                 Value = parts[1],&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum133" style="color: #606060;"&gt; 133:&lt;/span&gt;                 Salt = parts[2],&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum134" style="color: #606060;"&gt; 134:&lt;/span&gt;                 Username = parts[3]&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum135" style="color: #606060;"&gt; 135:&lt;/span&gt;             };&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum136" style="color: #606060;"&gt; 136:&lt;/span&gt;         }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum137" style="color: #606060;"&gt; 137:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&lt;pre&gt;&lt;span id="lnum138" style="color: #606060;"&gt; 138:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这里只是UnitTest的一部分，使用Moq来实现Mock&amp;nbsp;HttpContext，从而实现对HttpContext的单元测试。&amp;nbsp;&lt;br /&gt; &lt;br /&gt;小结： Web站点的安全问题，不可轻视。特别现在Ajax大量应用，做好安全检测很重要。&lt;/p&gt;&#xD;
&lt;p&gt;希望对您Web开发有帮助。&lt;/p&gt;&#xD;
&lt;div id="AllanboltSignature"&gt;&#xD;
&lt;p id="PSignature" style="padding-bottom: 10px; padding-left: 60px; padding-right: 10px; font-family: 微软雅黑; font-size: 12px; padding-top: 10px; border: #e0e0e0 1px dashed;"&gt;&lt;br /&gt;作者：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;Petter Liu&lt;/a&gt; &lt;br /&gt;出处：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;http://www.cnblogs.com/wintersun/&lt;/a&gt; &lt;br /&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 &lt;br /&gt;该文章也同时发布在我的独立博客中-&lt;a href="http://www.cnblogs.com/wintersun/"&gt;Petter Liu Blog&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/wintersun/aggbug/2282675.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2011/12/09/2282675.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wintersun/archive/2011/12/02/2272592.html</id><title type="text">Asp.net MVC3 RTM的源代调试</title><summary type="text">首先，从CodePlex下载源码。 解压后编译一下，然后在我们要调试的Solution中开发那下面的项目： System.Web.Mvc System.Web.Helpers System.Web.WebPages System.Web.Razor System.Web.WebPages.Razor 同时也删除原来以上程序集原来的引用...</summary><published>2011-12-02T10:50:00Z</published><updated>2011-12-02T10:50:00Z</updated><author><name>PetterLiu</name><uri>http://www.cnblogs.com/wintersun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wintersun/archive/2011/12/02/2272592.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wintersun/archive/2011/12/02/2272592.html"/><content type="html">&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 首先，从CodePlex&lt;a href="http://aspnet.codeplex.com/releases/view/58781#DownloadId=195410"&gt;下载源码&lt;/a&gt;。 解压后编译一下，然后在我们要调试的Solution中开发那下面的项目：&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;System.Web.Mvc&lt;/p&gt;    &lt;p&gt;System.Web.Helpers&lt;/p&gt;    &lt;p&gt;System.Web.WebPages&lt;/p&gt;    &lt;p&gt;System.Web.Razor&lt;/p&gt;    &lt;p&gt;System.Web.WebPages.Razor&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 同时也删除原来以上程序集原来的引用。 接下来是修改web.config，assemblies节，删除version,culture,PublicKeyToken信息,一个简单方法搜索&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 替换为空，最后效果如下：&lt;/p&gt;  &lt;div&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;assemblies&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;assembly&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;assembly&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;assembly&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;System.Web.Helpers&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;assembly&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;System.Web.Mvc &amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;assembly&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;System.Web.WebPages&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;assemblies&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 还有View文件夹下的web.config需要修改，也是删除对应此用version,culture,PublicKeyToken信息，结果如下：&lt;/p&gt;&#xD;
&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;configSections&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;sectionGroup&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;system.web.webPages.razor&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor &amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;section&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;host&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor &amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;requirePermission&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;section&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;pages&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor &amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;requirePermission&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;sectionGroup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;configSections&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 好了，到这儿我们修改两个web.config的某个配置节，删除原来对GAC的引用，而引用我们下来的源代码项目。 我们就可以调试到ASP.NET MVC3 RTM 源码中了。&#xD;
  &lt;br /&gt;希望对您Web开发有帮助。&#xD;
&#xD;
  &lt;br /&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;div id="AllanboltSignature"&gt;&#xD;
  &lt;p style="border-bottom: #e0e0e0 1px dashed; border-left: #e0e0e0 1px dashed; padding-bottom: 10px; padding-left: 60px; padding-right: 10px; font-family: 微软雅黑; font-size: 12px; border-top: #e0e0e0 1px dashed; border-right: #e0e0e0 1px dashed; padding-top: 10px" id="PSignature"&gt;&lt;br /&gt;作者：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;Petter Liu&lt;/a&gt; &#xD;
&#xD;
    &lt;br /&gt;出处：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;http://www.cnblogs.com/wintersun/&lt;/a&gt; &#xD;
&#xD;
    &lt;br /&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 &#xD;
&#xD;
    &lt;br /&gt;该文章也同时发布在我的独立博客中-&lt;a href="http://www.cnblogs.com/wintersun/"&gt;Petter Liu Blog&lt;/a&gt;。 &lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/wintersun/aggbug/2272592.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2011/12/02/2272592.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wintersun/archive/2011/11/27/2265394.html</id><title type="text">Lazy&amp;lt;T&amp;gt;的应用之类内部字段与C#延迟加载</title><summary type="text">延迟加载主要应用在以下场景: 数据层 – ADO.NET或Entity Framework等ORM反射 – 加载assemblies, types, MEF 缓存对象,领域实体 下面以领域实体为例, 在实体中我们经常检查某个属性下字段是否为空引用. 如果是空的话,计算或填充这个字段. 像这样: 1: /// &amp;lt;summary&amp;gt; 2: /// Order 3:...</summary><published>2011-11-27T14:54:00Z</published><updated>2011-11-27T14:54:00Z</updated><author><name>PetterLiu</name><uri>http://www.cnblogs.com/wintersun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wintersun/archive/2011/11/27/2265394.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wintersun/archive/2011/11/27/2265394.html"/><content type="html">&lt;p&gt;延迟加载主要应用在以下场景:&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;数据层 – ADO.NET或Entity Framework等ORM&lt;br&gt;反射 – 加载assemblies, types, MEF &lt;br&gt;缓存对象,领域实体&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;下面以领域实体为例, 在实体中我们经常检查某个属性下字段是否为空引用. 如果是空的话,计算或填充这个字段. 像这样:&lt;/p&gt; &lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;    &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;    &lt;span &gt;/// Order&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;    &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;    &lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; Order&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;    { &lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;        &lt;span &gt;private&lt;/span&gt; Customer _customer;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   7:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   8:  &lt;/span&gt;        &lt;span &gt;/// Gets the customer.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   9:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  10:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; Customer Customer&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  11:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  12:  &lt;/span&gt;            get&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  13:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  14:  &lt;/span&gt;                &lt;span &gt;if&lt;/span&gt; (_customer == &lt;span &gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  15:  &lt;/span&gt;                {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  16:  &lt;/span&gt;                    _customer = &lt;span &gt;new&lt;/span&gt; Customer();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  17:  &lt;/span&gt;                } &lt;span &gt;return&lt;/span&gt; _customer;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  18:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  19:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  20:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  21:  &lt;/span&gt;        &lt;span &gt;/// Prints the label.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  22:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  23:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  24:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; PrintLabel()&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  25:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  26:  &lt;/span&gt;            &lt;span &gt;return&lt;/span&gt; Customer.CompanyName + &lt;span &gt;"\n"&lt;/span&gt; + Customer.Address;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  27:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  28:  &lt;/span&gt;    }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;如果PrintLabel方法写成这样:&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; PrintLabel()&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;            &lt;span &gt;string&lt;/span&gt; result = _customer.CompanyName; &lt;span &gt;// probably results in a NullReferenceException    &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;            &lt;span &gt;return&lt;/span&gt; result + &lt;span &gt;"\n"&lt;/span&gt; + Customer.Address; &lt;span &gt;// ok to access Customer  &lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;        }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;注意上面第4行代码,可能有空引用异常. 下面我们使用&lt;a href="http://msdn.microsoft.com/zh-cn/library/dd642331.aspx" target="_blank"&gt;Lazy&amp;lt;T&amp;gt;&lt;/a&gt;来解决这个问题:&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;    &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;    &lt;span &gt;/// Order&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;    &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;    &lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; Order&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   7:  &lt;/span&gt;        &lt;span &gt;/// _customerInitializer&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   8:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   9:  &lt;/span&gt;        &lt;span &gt;private&lt;/span&gt; Lazy&amp;lt;Customer&amp;gt; _customerInitializer;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  10:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  11:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  12:  &lt;/span&gt;        &lt;span &gt;/// Initializes a new instance of the &amp;lt;see cref="Order"/&amp;gt; class.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  13:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  14:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; Order()&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  15:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  16:  &lt;/span&gt;            _customerInitializer = &lt;span &gt;new&lt;/span&gt; Lazy&amp;lt;Customer&amp;gt;(() =&amp;gt; &lt;span &gt;new&lt;/span&gt; Customer(),isThreadSafe:&lt;span &gt;true&lt;/span&gt;);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  17:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  18:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  19:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  20:  &lt;/span&gt;        &lt;span &gt;/// Gets the customer.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  21:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  22:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; Customer Customer&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  23:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  24:  &lt;/span&gt;            get{ &lt;span &gt;return&lt;/span&gt; _customerInitializer.Value;}&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  25:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  26:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  27:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  28:  &lt;/span&gt;        &lt;span &gt;/// Prints the label.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  29:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  30:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  31:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; PrintLabel()&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  32:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  33:  &lt;/span&gt;            &lt;span &gt;string&lt;/span&gt; result = Customer.CompanyName; &lt;span &gt;// ok to access Customer       &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  34:  &lt;/span&gt;            &lt;span &gt;return&lt;/span&gt; result + &lt;span &gt;"\n"&lt;/span&gt; + _customerInitializer.Value.Address; &lt;span &gt;// ok to access via .Value  &lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  35:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  36:  &lt;/span&gt;    }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;上面的代码16行,我们延迟初始化对像实例,并且设置线程安全.&amp;nbsp; Lazy&amp;lt;T&amp;gt;内部是使用Func&amp;lt;T&amp;gt;来实现的,看下面其中构造器的源代码:&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;&lt;span &gt;public&lt;/span&gt; Lazy(Func&amp;lt;T&amp;gt; valueFactory, LazyThreadSafetyMode mode)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;    &lt;span &gt;if&lt;/span&gt; (valueFactory == &lt;span &gt;null&lt;/span&gt;) &lt;span &gt;throw&lt;/span&gt; &lt;span &gt;new&lt;/span&gt; ArgumentNullException(&lt;span &gt;"valueFactory"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;    &lt;span &gt;this&lt;/span&gt;.m_threadSafeObj = Lazy&amp;lt;T&amp;gt;.GetObjectFromMode(mode);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;    &lt;span &gt;this&lt;/span&gt;.m_valueFactory = valueFactory;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;有兴趣请自行查看.net framework中的源码. 我们还可以扩展一个LazyNotNull&amp;lt;T&amp;gt;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;    &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;    &lt;span &gt;/// LazyNotNull&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;    &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;    &lt;span &gt;/// &amp;lt;typeparam name="T"&amp;gt;Type&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;    &lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; LazyNotNull&amp;lt;T&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   7:  &lt;/span&gt;        &lt;span &gt;private&lt;/span&gt; Lazy&amp;lt;T&amp;gt; _lazyValue = &lt;span &gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   8:  &lt;/span&gt;        &lt;span &gt;private&lt;/span&gt; Func&amp;lt;T&amp;gt; _valueFactory = &lt;span &gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  10:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  11:  &lt;/span&gt;        &lt;span &gt;/// Initializes a new instance of the &amp;lt;see cref="LazyNotNull&amp;amp;lt;T&amp;amp;gt;"/&amp;gt; class.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  12:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  13:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;param name="valueFactory"&amp;gt;The value factory.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  14:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; LazyNotNull(Func&amp;lt;T&amp;gt; valueFactory)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  15:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  16:  &lt;/span&gt;            _lazyValue = &lt;span &gt;new&lt;/span&gt; Lazy&amp;lt;T&amp;gt;(valueFactory);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  17:  &lt;/span&gt;            _valueFactory = valueFactory;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  18:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  19:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  20:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  21:  &lt;/span&gt;        &lt;span &gt;/// Gets T value.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  22:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  23:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; T Value&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  24:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  25:  &lt;/span&gt;            get&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  26:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  27:  &lt;/span&gt;                var lazyValue = _lazyValue;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  28:  &lt;/span&gt;                &lt;span &gt;if&lt;/span&gt; (lazyValue.Value != &lt;span &gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  29:  &lt;/span&gt;                {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  30:  &lt;/span&gt;                    &lt;span &gt;return&lt;/span&gt; lazyValue.Value;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  31:  &lt;/span&gt;                }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  32:  &lt;/span&gt;                _lazyValue = &lt;span &gt;new&lt;/span&gt; Lazy&amp;lt;T&amp;gt;(_valueFactory);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  33:  &lt;/span&gt;                &lt;span &gt;return&lt;/span&gt; &lt;span &gt;default&lt;/span&gt;(T);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  34:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  35:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  36:  &lt;/span&gt;    }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br&gt;希望这篇POST对您开发有帮助. &lt;br&gt;您可能感兴趣的文章:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2011/04/26/2029281.html"&gt;.net4.0下的Lazy&amp;lt;T&amp;gt;类型简单应用&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2009/03/29/1424352.html"&gt;.net3.5下使用LINQ递归算法实现简洁代码&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&#xD;
&lt;div id="AllanboltSignature"&gt;&#xD;
&lt;p id="PSignature" style="border-right: #e0e0e0 1px dashed; padding-right: 10px; border-top: #e0e0e0 1px dashed; padding-left: 60px; font-size: 12px; padding-bottom: 10px; border-left: #e0e0e0 1px dashed; padding-top: 10px; border-bottom: #e0e0e0 1px dashed; font-family: 微软雅黑"&gt;&lt;br&gt;作者：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;Petter Liu&lt;/a&gt; &lt;br&gt;出处：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;http://www.cnblogs.com/wintersun/&lt;/a&gt; &lt;br&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 &lt;br&gt;该文章也同时发布在我的独立博客中-&lt;a href="http://www.cnblogs.com/wintersun/"&gt;Petter Liu Blog&lt;/a&gt;。 &lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/wintersun/aggbug/2265394.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2011/11/27/2265394.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wintersun/archive/2011/11/19/2255622.html</id><title type="text">数据访问层的单元测试</title><summary type="text">数据访问层在分层结构,比较常见. 有时可能是数据访问模块. 假设数据访问层后端是数据库,那我们如何测试他们的呢? 有时实际这种测试是集成测试了.有时数据库里还有一些逻辑,触发器,约束等. 个人十分不建议把业务逻辑放在数据库里实现. 最常见的数据库表的操作create, read, update和delete(简称CRUD), 例如我们需要测试某个Add方法,在这个测试方法完成后, 希望这条测试数...</summary><published>2011-11-19T15:05:00Z</published><updated>2011-11-19T15:05:00Z</updated><author><name>PetterLiu</name><uri>http://www.cnblogs.com/wintersun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wintersun/archive/2011/11/19/2255622.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wintersun/archive/2011/11/19/2255622.html"/><content type="html">&lt;p&gt;数据访问层在分层结构,比较常见. 有时可能是数据访问模块. 假设数据访问层后端是数据库,那我们如何测试他们的呢? 有时实际这种测试是集成测试了.&lt;br&gt;有时数据库里还有一些逻辑,触发器,约束等. 个人十分不建议把业务逻辑放在数据库里实现. 最常见的数据库表的操作create, read, update和delete(简称&lt;a href="http://en.wikipedia.org/wiki/Create%2C_read%2C_update_and_delete" target="_blank"&gt;CRUD&lt;/a&gt;)&lt;br&gt;, 例如我们需要测试某个Add方法,在这个测试方法完成后, 希望这条测试数据清除掉. 这样做是 为了不影响其它的测试方法也访问同一数据库对象.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 首先,我们可以使用.net 2.0中提供的&lt;a href="http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx" target="_blank"&gt;TransactionScope&lt;/a&gt;类, 下面的代码基于&lt;a href="http://en.wikipedia.org/wiki/MSTest" target="_blank"&gt;MsTest&lt;/a&gt;的单元测试:&lt;/p&gt; &lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;    [TestClass]&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;    &lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; DbTestBase&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;        &lt;span &gt;private&lt;/span&gt; TransactionScope scope;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;        [TestInitialize]&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   7:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; SetUp()&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   8:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   9:  &lt;/span&gt;            &lt;span &gt;this&lt;/span&gt;.scope = &lt;span &gt;new&lt;/span&gt; TransactionScope();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  10:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  11:  &lt;/span&gt;        &lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  12:  &lt;/span&gt;        [TestCleanup]&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  13:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; TearDown()&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  14:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  15:  &lt;/span&gt;            &lt;span &gt;this&lt;/span&gt;.scope.Dispose();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  16:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  17:  &lt;/span&gt;    }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;上面代码我们看到在标记TestInitialize特性SetUp方法中创建TransactionScope的实例,在TestCleanup特性TearDown方法中调用TransactionScope的&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.transactions.transactionscope.dispose.aspx" target="_blank"&gt;Dispose&lt;/a&gt;方法.&amp;nbsp; 然后我们继承这个测试基类:&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;    [TestClass]&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;    &lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; DateBaseTesting : DbTestBase&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;        &lt;span &gt;/// Test Insert record to database&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   7:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;seealso cref="http://www.cnblogs.com/wintersun"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   8:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;remarks&amp;gt;Any database modification will be roll back&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   9:  &lt;/span&gt;        [TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  10:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; TestAddWithEmployeeRepository()&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  11:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  12:  &lt;/span&gt;            &lt;span &gt;//arrange&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  13:  &lt;/span&gt;            var employee = &lt;span &gt;this&lt;/span&gt;.CreateNewEmployee();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  14:  &lt;/span&gt;            var employRepository = RepositoryHelper.GetEmployeeRepository();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  15:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  16:  &lt;/span&gt;            &lt;span &gt;//act&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  17:  &lt;/span&gt;            employRepository.Add(employee);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  18:  &lt;/span&gt;            employRepository.Save();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  19:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  20:  &lt;/span&gt;            &lt;span &gt;//assert&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  21:  &lt;/span&gt;            var employeelist =&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  22:  &lt;/span&gt;               employRepository.Repository.Find(e =&amp;gt; e.EmployeeID == employee.EmployeeID);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  23:  &lt;/span&gt;            Assert.IsNotNull(employeelist);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  24:  &lt;/span&gt;            CollectionAssert.AreEqual(&lt;span &gt;new&lt;/span&gt; List&amp;lt;Employee&amp;gt;() { employee }, employeelist.ToList());&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  25:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  26:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  27:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  28:  &lt;/span&gt;        &lt;span &gt;private&lt;/span&gt; Employee CreateNewEmployee()&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  29:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  30:  &lt;/span&gt;            var employee = &lt;span &gt;new&lt;/span&gt; Employee&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  31:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  32:  &lt;/span&gt;                ManagerID = 2,&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  33:  &lt;/span&gt;                ContactID = 3,&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  34:  &lt;/span&gt;                Title = &lt;span &gt;"Developer"&lt;/span&gt;,&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  35:  &lt;/span&gt;                BirthDate = &lt;span &gt;new&lt;/span&gt; DateTime(1965, 1, 1, 0, 0, 0),&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  36:  &lt;/span&gt;                HireDate = DateTime.Now,&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  37:  &lt;/span&gt;                Gender = &lt;span &gt;"M"&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  38:  &lt;/span&gt;                MaritalStatus = &lt;span &gt;"M"&lt;/span&gt;,&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  39:  &lt;/span&gt;                ModifiedDate = DateTime.Now,&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  40:  &lt;/span&gt;                NationalIDNumber = &lt;span &gt;"2"&lt;/span&gt;,&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  41:  &lt;/span&gt;                rowguid = &lt;span &gt;new&lt;/span&gt; Guid(),&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  42:  &lt;/span&gt;                CurrentFlag = &lt;span &gt;true&lt;/span&gt;,&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  43:  &lt;/span&gt;                VacationHours = 2,&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  44:  &lt;/span&gt;                SickLeaveHours = 3,&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  45:  &lt;/span&gt;                SalariedFlag = &lt;span &gt;false&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  46:  &lt;/span&gt;                LoginID = &lt;span &gt;"myworkbase\\peter"&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  47:  &lt;/span&gt;            };&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  48:  &lt;/span&gt;            &lt;span &gt;return&lt;/span&gt; employee;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  49:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  50:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  51:  &lt;/span&gt;    }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;上面的TestAddWithEmployeeRepository中场景是数据访问层基于EntityFramework的Repository模式, 这里的操作是先是创建实体,然后是提交.&amp;nbsp; 实际中可以是您的任何代码块,ADO.NET或其他的数据访问组件. 当我们执行这个单元测试后,这个TransactionScope将被释放. 之前插入的那条记录将被清除. &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 假设你不想用基类, 只是简单在某个方法中, 可以这样做:&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;        [TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; TestWrapTransactionScope()&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;            WrapTransactionScope(() =&amp;gt; TestAddWithEmployeeRepository());&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   7:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   8:  &lt;/span&gt;        &lt;span &gt;/// Wraps the transaction scope for unit testing&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   9:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  10:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;param name="action"&amp;gt;The action method&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  11:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;remarks&amp;gt;author http://www.cnblogs.com/wintersun &amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  12:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; WrapTransactionScope(Action action)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  13:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  14:  &lt;/span&gt;            &lt;span &gt;using&lt;/span&gt; (var scope = &lt;span &gt;new&lt;/span&gt; TransactionScope())&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  15:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  16:  &lt;/span&gt;                action();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  17:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  18:  &lt;/span&gt;        }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;上面的代码演示了, 我们用&lt;a href="msdn.microsoft.com/en-us/library/system.action.aspx" target="_blank"&gt;Action委托&lt;/a&gt;实现另一个方法包装一下目标方法使其在TransactionScope块中.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们还可以使用&lt;a href="www.codeplex.com/xunit" target="_blank"&gt;xUnit&lt;/a&gt; 类库 这实现同样的操作, 这里使用是xUnit 1.8版本. 还有MbUnit,NUnit的&lt;a href="http://osherove.com/blog/2004/7/11/introducing-nunitx-and-the-rollback-attribute-seamless-datab.html" target="_blank"&gt;[RollBack]特性&lt;/a&gt;与这个类似. 如果您还不熟悉怎么使用xUnit请先看&lt;a href="http://xunit.codeplex.com/wikipage?title=HowToUse&amp;amp;referringTitle=Home" target="_blank"&gt;这里&lt;/a&gt;介绍. 下面的代码使用 xUnit 代码变得更加简洁:&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;    &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;    &lt;span &gt;/// Database unit testing with xUnit demo&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;    &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;    &lt;span &gt;/// &amp;lt;remarks&amp;gt;http://wintersun.cnblogs.com &amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;    &lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; TestDbWithxUnit&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   7:  &lt;/span&gt;        [Fact]&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   8:  &lt;/span&gt;        [AutoRollback]&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   9:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; Test_Add_One_Enity()&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  10:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  11:  &lt;/span&gt;            &lt;span &gt;//arrange&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  12:  &lt;/span&gt;            var employee = &lt;span &gt;this&lt;/span&gt;.CreateNewEmployee();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  13:  &lt;/span&gt;            var employRepository = RepositoryHelper.GetEmployeeRepository();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  14:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  15:  &lt;/span&gt;            &lt;span &gt;//act&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  16:  &lt;/span&gt;            employRepository.Add(employee);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  17:  &lt;/span&gt;            employRepository.Save();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  18:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  19:  &lt;/span&gt;            &lt;span &gt;//assert&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  20:  &lt;/span&gt;            var employeelist =&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  21:  &lt;/span&gt;               employRepository.Repository.Find(e =&amp;gt; e.EmployeeID == employee.EmployeeID);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  22:  &lt;/span&gt;            Assert.NotNull(employeelist);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  23:  &lt;/span&gt;            Assert.Equal(&lt;span &gt;new&lt;/span&gt; List&amp;lt;Employee&amp;gt; { employee }, employeelist.ToList());&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  24:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  25:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;上面的代码我们只需在方法上加一个AutoRollback的Attribute就可以了, 注意你先需要引用xunit.extensions.dll&lt;br&gt;当然,最标准的单元测试我们完全隔离数据库, 数据访问组件在单元测试中不应该访问数据库. 我们使用Mock框架来实现对数据库的隔离, 如下代码演示了我们使用&lt;a href="http://code.google.com/p/moq/" target="_blank"&gt;Moq&lt;/a&gt; v4.0.20926 和 xUnit 来实现的单元测试:&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;        [Fact]&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; TestWithMoq()&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;            &lt;span &gt;//arrange&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;            var mock = &lt;span &gt;new&lt;/span&gt; Mock&amp;lt;IRepository&amp;lt;Employee&amp;gt;&amp;gt;();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;            Employee employee = &lt;span &gt;this&lt;/span&gt;.CreateNewEmployee();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   7:  &lt;/span&gt;            var list = &lt;span &gt;new&lt;/span&gt; List&amp;lt;Employee&amp;gt;() { employee };&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   8:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   9:  &lt;/span&gt;            mock.Setup(ep =&amp;gt; ep.Add(It.IsAny&amp;lt;Employee&amp;gt;()))&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  10:  &lt;/span&gt;                .Callback(()=&amp;gt;Console.WriteLine(&lt;span &gt;"Add()"&lt;/span&gt;));&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  11:  &lt;/span&gt;            mock.Setup(ep =&amp;gt; ep.Find(It.IsAny&amp;lt;Expression&amp;lt;Func&amp;lt;Employee, &lt;span &gt;bool&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt;()))&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  12:  &lt;/span&gt;                .Returns(list);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  13:  &lt;/span&gt;            mock.Setup(ep =&amp;gt; ep.Save())&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  14:  &lt;/span&gt;             .Callback(() =&amp;gt; Console.WriteLine(&lt;span &gt;"Save()"&lt;/span&gt;));&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  15:  &lt;/span&gt;            var employeeRespository = mock.Object;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  16:  &lt;/span&gt;           &lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  17:  &lt;/span&gt;            &lt;span &gt;//act&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  18:  &lt;/span&gt;            employeeRespository.Add(employee);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  19:  &lt;/span&gt;            employeeRespository.Save();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  20:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  21:  &lt;/span&gt;            &lt;span &gt;//verify method &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  22:  &lt;/span&gt;            mock.Verify(ep =&amp;gt; ep.Add(It.IsAny&amp;lt;Employee&amp;gt;()));&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  23:  &lt;/span&gt;            mock.Verify(ep =&amp;gt; ep.Save());&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  24:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  25:  &lt;/span&gt;            &lt;span &gt;//assert&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  26:  &lt;/span&gt;            var employeelist =&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  27:  &lt;/span&gt;              employeeRespository.Find(e =&amp;gt; e.EmployeeID == employee.EmployeeID);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  28:  &lt;/span&gt;            Assert.NotNull(employeelist);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  29:  &lt;/span&gt;            Assert.Equal(&lt;span &gt;new&lt;/span&gt; List&amp;lt;Employee&amp;gt; { employee }, employeelist.ToList());&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  30:  &lt;/span&gt;        }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;Employee是实体类, IRepository&amp;lt;T&amp;gt;是一个统一数据访问interface, 实现martinfowler的&lt;a href="http://martinfowler.com/eaaCatalog/repository.html" target="_blank"&gt;Repository模式&lt;/a&gt;;&amp;nbsp; 上面的代码Mock了其中的Add,Save方法, 在调用后并做了Verify,确认之前Mock的方法有被调用到,&amp;nbsp; 最后的部分才是Assert语句块. 代码很简单. &lt;/p&gt;&#xD;
&lt;p&gt;除了使用Mock框架, 我们还可以使用依赖注入容器来注入一个具体的Fake对象实现对访问数据库的隔离, 我们使用&lt;a href="http://unity.codeplex.com/" target="_blank"&gt;Unity&lt;/a&gt; 2.1 来实现:&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;        [Fact]&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; TestWithDIContainer()&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;            &lt;span &gt;//arrange&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;            var employee = &lt;span &gt;this&lt;/span&gt;.CreateNewEmployee();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;            var list = &lt;span &gt;new&lt;/span&gt; List&amp;lt;Employee&amp;gt;() { employee };&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   7:  &lt;/span&gt;            var employeeRespository = GetRepositoryInstance(&lt;span &gt;"for testing"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   8:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   9:  &lt;/span&gt;            &lt;span &gt;//act&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  10:  &lt;/span&gt;            employeeRespository.Add(employee);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  11:  &lt;/span&gt;            employeeRespository.Save();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  12:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  13:  &lt;/span&gt;            &lt;span &gt;//assert&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  14:  &lt;/span&gt;            var employeelist =&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  15:  &lt;/span&gt;              employeeRespository.Find(e =&amp;gt; e.EmployeeID == employee.EmployeeID);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  16:  &lt;/span&gt;            Assert.NotNull(employeelist);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  17:  &lt;/span&gt;            Assert.Equal(&lt;span &gt;new&lt;/span&gt; List&amp;lt;Employee&amp;gt; { employee }, employeelist.ToList());&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  18:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  19:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  20:  &lt;/span&gt;        &lt;span &gt;private&lt;/span&gt; IRepository&amp;lt;Employee&amp;gt; GetRepositoryInstance(&lt;span &gt;string&lt;/span&gt; name)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  21:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  22:  &lt;/span&gt;            &lt;span &gt;//Initial container&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  23:  &lt;/span&gt;            var container = &lt;span &gt;new&lt;/span&gt; UnityContainer();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  24:  &lt;/span&gt;            container.RegisterType&amp;lt;IRepository&amp;lt;Employee&amp;gt;, EFRepository&amp;lt;Employee&amp;gt;&amp;gt;();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  25:  &lt;/span&gt;            container.RegisterType&amp;lt;IRepository&amp;lt;Employee&amp;gt;, FakeRepository&amp;lt;Employee&amp;gt;&amp;gt;(&lt;span &gt;"for testing"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  26:  &lt;/span&gt;            &lt;span &gt;//....&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  27:  &lt;/span&gt;            &lt;span &gt;return&lt;/span&gt; container.Resolve&amp;lt;IRepository&amp;lt;Employee&amp;gt;&amp;gt;(name);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  28:  &lt;/span&gt;        }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;上面的代码为了演示的简便, 我们实现创建容器注册对象在一个private方法中; 您也可以使用其它IOC/DI的容器. FakeRepository&amp;lt;Employee&amp;gt;是一个实现了IRepository&amp;lt;T&amp;gt;的具体类, 在其内部可以在内存中操作实体,或是其它方式. 具体看您的需求了.&lt;br&gt;&lt;br&gt;以上所有是我们介绍对数据访问层或数据库进行单元测试的解决方法:&lt;br&gt;&lt;br&gt;1. 使用&lt;a href="http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx" target="_blank"&gt;TransactionScope&lt;/a&gt;类实现测试方法回滚&lt;br&gt;2. 使用xUnit类库的AutoRollback特性实现自动回滚&lt;br&gt;3. 使用Moq框架来实现隔离数据库的访问&lt;br&gt;4. 使用Unity容器注入Fake对象来实现隔离数据库的访问&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;br&gt;希望这篇文章对您做开发与单元测试有帮助.&lt;br&gt;您可以感兴趣的文章:&lt;br&gt;&lt;br&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2010/09/04/1818092.html"&gt;使用Moq来Mock多个接口&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2011/09/04/2166773.html"&gt;MsTest中实现类似NUnit中Assert.Throws&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2010/07/25/1784856.html"&gt;Repository Factory介绍&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2010/11/05/1870240.html"&gt;Unity在Xml配制文件使用泛型&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&#xD;
&lt;div id="AllanboltSignature"&gt;&#xD;
&lt;p id="PSignature" style="border-right: #e0e0e0 1px dashed; padding-right: 10px; border-top: #e0e0e0 1px dashed; padding-left: 60px; font-size: 12px; padding-bottom: 10px; border-left: #e0e0e0 1px dashed; padding-top: 10px; border-bottom: #e0e0e0 1px dashed; font-family: 微软雅黑"&gt;&lt;br&gt;作者：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;Petter Liu&lt;/a&gt; &lt;br&gt;出处：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;http://www.cnblogs.com/wintersun/&lt;/a&gt; &lt;br&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 &lt;br&gt;该文章也同时发布在我的独立博客中-&lt;a href="http://www.cnblogs.com/wintersun/"&gt;Petter Liu Blog&lt;/a&gt;。 &lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/wintersun/aggbug/2255622.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2011/11/19/2255622.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wintersun/archive/2011/11/12/2246513.html</id><title type="text">Asp.net Web Applicatoin实现自定义HttpModule拦截异常处理</title><summary type="text">Asp.net的NamePipe机制给我们提供了很多扩展性. 使用HttpModule我们可能实现的有: 强制站点范围的Cookie策略 集中化监控与日志 编写设置与删除HTTP头 控制response输出,如删除多余空白字符 Session管理 认证与受权 下面我们来看如何实现自定义异常处理: 1: public class ErrorModule:IHttpModule 2...</summary><published>2011-11-12T08:55:00Z</published><updated>2011-11-12T08:55:00Z</updated><author><name>PetterLiu</name><uri>http://www.cnblogs.com/wintersun/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wintersun/archive/2011/11/12/2246513.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wintersun/archive/2011/11/12/2246513.html"/><content type="html">&lt;p&gt;Asp.net的NamePipe机制给我们提供了很多扩展性. 使用HttpModule我们可能实现的有:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;强制站点范围的Cookie策略&lt;/li&gt; &lt;li&gt;集中化监控与日志&lt;/li&gt; &lt;li&gt;编写设置与删除HTTP头&lt;/li&gt; &lt;li&gt;控制response输出,如删除多余空白字符&lt;/li&gt; &lt;li&gt;Session管理&lt;/li&gt; &lt;li&gt;认证与受权&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;下面我们来看如何实现自定义异常处理:&lt;/p&gt; &lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;  &lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; ErrorModule:IHttpModule&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;        &lt;span &gt;#region&lt;/span&gt; IHttpModule Members&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;        &lt;span &gt;/// Disposes of the resources (other than memory) used by the module that implements &amp;lt;see cref="T:System.Web.IHttpModule"/&amp;gt;.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   7:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   8:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; Dispose()&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   9:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  10:  &lt;/span&gt;            &lt;span &gt;//do nothing &lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  11:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  12:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  13:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  14:  &lt;/span&gt;        &lt;span &gt;/// Initializes a module and prepares it to handle requests.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  15:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  16:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;param name="context"&amp;gt;An &amp;lt;see cref="T:System.Web.HttpApplication"/&amp;gt; that provides access to the methods, properties, and events common to all application objects within an ASP.NET application&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  17:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; Init(HttpApplication context)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  18:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  19:  &lt;/span&gt;            context.Error += &lt;span &gt;new&lt;/span&gt; EventHandler(customcontext_Error);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  20:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  21:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  22:  &lt;/span&gt;        &lt;span &gt;private&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; customcontext_Error(&lt;span &gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  23:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  24:  &lt;/span&gt;            HttpContext ctx = HttpContext.Current;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  25:  &lt;/span&gt;            HttpResponse response = ctx.Response;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  26:  &lt;/span&gt;            HttpRequest request = ctx.Request;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  27:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  28:  &lt;/span&gt;            Exception exception = ctx.Server.GetLastError();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  29:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  30:  &lt;/span&gt;            var sboutput = &lt;span &gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  31:  &lt;/span&gt;            sboutput.Append(&lt;span &gt;"Querystring:&amp;lt;p/&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  32:  &lt;/span&gt;            &lt;span &gt;//Get out the query string &lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  33:  &lt;/span&gt;            &lt;span &gt;int&lt;/span&gt; count = request.QueryString.Count;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  34:  &lt;/span&gt;            &lt;span &gt;for&lt;/span&gt; (&lt;span &gt;int&lt;/span&gt; i = 0; i &amp;lt; count; i++)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  35:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  36:  &lt;/span&gt;                sboutput.AppendFormat(&lt;span &gt;"&amp;lt;br/&amp;gt; {0}:-- {1} "&lt;/span&gt;, request.QueryString.Keys[i], request.QueryString[i]);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  37:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  38:  &lt;/span&gt;            &lt;span &gt;//Get out the form collection info&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  39:  &lt;/span&gt;            sboutput.Append(&lt;span &gt;"&amp;lt;p&amp;gt;-------------------------&amp;lt;p/&amp;gt;Form:&amp;lt;p/&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  40:  &lt;/span&gt;            count = request.Form.Count;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  41:  &lt;/span&gt;            &lt;span &gt;for&lt;/span&gt; (&lt;span &gt;int&lt;/span&gt; i = 0; i &amp;lt; count; i++)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  42:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  43:  &lt;/span&gt;                sboutput.AppendFormat(&lt;span &gt;"&amp;lt;br/&amp;gt; {0}:-- {1}  -- &amp;lt;br/&amp;gt;"&lt;/span&gt;, request.Form.Keys[i], request.Form[i]);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  44:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  45:  &lt;/span&gt;            sboutput.Append(&lt;span &gt;"&amp;lt;p&amp;gt;-------------------------&amp;lt;p/&amp;gt;ErrorInfo:&amp;lt;p/&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  46:  &lt;/span&gt;            sboutput.AppendFormat(&lt;span &gt;@"Your request could not processed. Please press the back button on your browser and try again.&amp;lt;br/&amp;gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  47:  &lt;/span&gt;                               If the problem persists, please contact technical support&amp;lt;p/&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  48:  &lt;/span&gt;                               Information below is for technical support:&amp;lt;p/&amp;gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  49:  &lt;/span&gt;                                &amp;lt;p/&amp;gt;URL:{0}&amp;lt;p/&amp;gt;Stacktrace:---&amp;lt;br/&amp;gt;{1}&amp;lt;p/&amp;gt;InnerException:&amp;lt;br/&amp;gt;{2}"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  50:  &lt;/span&gt;         , ctx.Request.Url, exception.InnerException.StackTrace, exception.InnerException);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  51:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  52:  &lt;/span&gt;           response.Write(sboutput.ToString());&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  53:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  54:  &lt;/span&gt;            &lt;span &gt;// To let the page finish running we clear the error&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  55:  &lt;/span&gt;            ctx.Server.ClearError();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  56:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  57:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  58:  &lt;/span&gt;        &lt;span &gt;#endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  59:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  60:  &lt;/span&gt;    }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;上面的代码实现了&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ihttpmodule.aspx" target="_blank"&gt;IHttpModule&lt;/a&gt;接口, 实现基于&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.httpapplication.error.aspx" target="_blank"&gt;HttpApplication.Error事件&lt;/a&gt;, 接着我们自定义输出了一些信息,包括Form,QueryString. 最后把原来的Error信息&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.clearerror.aspx" target="_blank"&gt;清除&lt;/a&gt;了,这样你看到以前那个黄页了. 这个自定义的Module可以用于调试Web应用程序使用. &lt;/p&gt;&#xD;
&lt;p&gt;Web.config中配置:&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;httpModules&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt; &lt;span &gt;name&lt;/span&gt;&lt;span &gt;="ErrorLoggingModule"&lt;/span&gt; &lt;span &gt;type&lt;/span&gt;&lt;span &gt;="MyWeb.ErrorModule"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;httpModules&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;实际开发中,我们可以做的事儿很多,对这些信息记日志,发邮件. 如下, 我们演示使用&lt;a href="http://msdn.microsoft.com/en-us/library/ff648951.aspx" target="_blank"&gt;Enterprise Library&lt;/a&gt; 做异常处理并日志记录,部分代码如下:&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;        &lt;span &gt;/// Handles the Error event of the EntLibLogging control.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;param name="sender"&amp;gt;The source of the event.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;param name="e"&amp;gt;The &amp;lt;see cref="System.EventArgs"/&amp;gt; instance containing the event data.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;remarks&amp;gt;author Petter Liu http://wintersun.cnblogs.com&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   7:  &lt;/span&gt;        &lt;span &gt;private&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; EntLibLogging_Error(&lt;span &gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   8:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   9:  &lt;/span&gt;            var builder = &lt;span &gt;new&lt;/span&gt; ConfigurationSourceBuilder();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  10:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  11:  &lt;/span&gt;            builder.ConfigureInstrumentation()&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  12:  &lt;/span&gt;              .ForApplicationInstance(&lt;span &gt;"MyApp"&lt;/span&gt;)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  13:  &lt;/span&gt;              .EnableLogging()&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  14:  &lt;/span&gt;             .EnablePerformanceCounters();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  15:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  16:  &lt;/span&gt;            &lt;span &gt;//a single exception handling policy named MyPolicy for exceptions of type ArgumentNullException. &lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  17:  &lt;/span&gt;            &lt;span &gt;//The handler for this exception policy will log the exception to the General category (defined in the Logging Application Block configuration) &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  18:  &lt;/span&gt;            &lt;span &gt;//as a warning with event ID 9000, wrap the ArgumentNullException with an InvalidOperationException, set the new exception message to MyMessage, and then re-throw the exception.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  19:  &lt;/span&gt;            builder.ConfigureExceptionHandling()&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  20:  &lt;/span&gt;                .GivenPolicyWithName(&lt;span &gt;"MyPolicy"&lt;/span&gt;)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  21:  &lt;/span&gt;                .ForExceptionType&amp;lt;ArgumentNullException&amp;gt;()&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  22:  &lt;/span&gt;                .LogToCategory(&lt;span &gt;"Exception"&lt;/span&gt;)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  23:  &lt;/span&gt;                  .WithSeverity(System.Diagnostics.TraceEventType.Warning)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  24:  &lt;/span&gt;                  .UsingEventId(9000)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  25:  &lt;/span&gt;                .WrapWith&amp;lt;InvalidOperationException&amp;gt;()&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  26:  &lt;/span&gt;                  .UsingMessage(&lt;span &gt;"MyMessage"&lt;/span&gt;)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  27:  &lt;/span&gt;                 .ThenNotifyRethrow();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  28:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  29:  &lt;/span&gt;            &lt;span &gt;//logging application &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  30:  &lt;/span&gt;            builder.ConfigureLogging()&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  31:  &lt;/span&gt;               .WithOptions&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  32:  &lt;/span&gt;               .DoNotRevertImpersonation()&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  33:  &lt;/span&gt;               .LogToCategoryNamed(&lt;span &gt;"Exception"&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  34:  &lt;/span&gt;               .SendTo.FlatFile(&lt;span &gt;"Exception Logging File"&lt;/span&gt;)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  35:  &lt;/span&gt;                .FormatWith(&lt;span &gt;new&lt;/span&gt; FormatterBuilder()&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  36:  &lt;/span&gt;                .TextFormatterNamed(&lt;span &gt;"Text Formatter"&lt;/span&gt;)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  37:  &lt;/span&gt;               . UsingTemplate(&lt;span &gt;"Timestamp: {timestamp}{newline}Message: {message}{newline}Category: {category}{newline}"&lt;/span&gt;))&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  38:  &lt;/span&gt;                .ToFile(&lt;span &gt;"d:\\logs\\ExceptionsLog.log"&lt;/span&gt;)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  39:  &lt;/span&gt;               .SendTo.RollingFile(&lt;span &gt;"Rolling Log files"&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  40:  &lt;/span&gt;               .RollAfterSize(1024)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  41:  &lt;/span&gt;               .ToFile(&lt;span &gt;"d:\\logs\\Rollinglog.log"&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  42:  &lt;/span&gt;               .LogToCategoryNamed(&lt;span &gt;"General"&lt;/span&gt;)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  43:  &lt;/span&gt;               .WithOptions.SetAsDefaultCategory()&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  44:  &lt;/span&gt;               .SendTo.SharedListenerNamed(&lt;span &gt;"Exception Logging File"&lt;/span&gt;);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  45:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  46:  &lt;/span&gt;            var configSource = &lt;span &gt;new&lt;/span&gt; DictionaryConfigurationSource();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  47:  &lt;/span&gt;            builder.UpdateConfigurationWithReplace(configSource);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  48:  &lt;/span&gt;            EnterpriseLibraryContainer.Current  = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  49:  &lt;/span&gt;          &lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  50:  &lt;/span&gt;            var ex = HttpContext.Current.Server.GetLastError();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  51:  &lt;/span&gt;            var em = EnterpriseLibraryContainer.Current.GetInstance&amp;lt;ExceptionManager&amp;gt;();&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  52:  &lt;/span&gt;            em.HandleException(ex.InnerException, &lt;span &gt;"MyPolicy"&lt;/span&gt;);   &lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  53:  &lt;/span&gt;        }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;注意上面的代码, 为了运行代码您需要引用以下程序集&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;Enterprise Library Share Common Library&lt;br&gt;Microsoft.Practices.ServiceLocation&lt;br&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff664569(v=PandP.50).aspx" target="_blank"&gt;Logging Application Block&lt;/a&gt;&lt;br&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff664698(v=PandP.50).aspx" target="_blank"&gt;Exception Handling Application Block&lt;/a&gt;&lt;br&gt;Exception Handling Logging Provider&lt;/p&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;这里我们使用Fluent API配置, 因此没有配置XML文件. 所以不需要Web.Config中配置任何信息. 代码中有注释. 为了测试我们使用一个PAGE故意Throw 一个ArgumentNullException. 通过&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.getlasterror.aspx" target="_blank"&gt;Server.GetLastError()&lt;/a&gt;获取Exception, 这时由名为MyPolicy策略处理异常. 对于&lt;a href="http://msdn.microsoft.com/en-us/library/system.argumentnullexception.aspx" target="_blank"&gt;ArgumentNullException&lt;/a&gt;把它们记录日志到名为Exception分类中,这个日志文件位于d:\\logs\\&lt;br&gt;ExceptionLog.log.实际开发你完全按照你的需要来自定义策略.&lt;/p&gt;&#xD;
&lt;p&gt;然后这个日志文件中写出的内容是这样的:&lt;/p&gt;&lt;pre &gt;----------------------------------------&#xD;
Timestamp: 2011-11-12 5:57:08&#xD;
Message: HandlingInstanceID: a99d005d-5f8d-4613-9522-2d60efb089aa&#xD;
An exception of type &lt;span &gt;'System.ArgumentNullException'&lt;/span&gt; occurred and was caught.&#xD;
----------------------------------------------------------------------------&#xD;
11/12/2011 13:57:08&#xD;
Type : System.ArgumentNullException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&#xD;
Message : Value cannot be &lt;span &gt;null&lt;/span&gt;.&#xD;
Parameter name: Demo error&#xD;
Source : MyWeb&#xD;
Help link : &#xD;
ParamName : Demo error&#xD;
Data : System.Collections.ListDictionaryInternal&#xD;
TargetSite : Void Page_Load(System.Object, System.EventArgs)&#xD;
Stack Trace :    at MyWeb.About.Page_Load(Object sender, EventArgs e) &lt;span &gt;in&lt;/span&gt; H:\My Project\DotNet40\TDD2010\WebHost\MyWeb\About.aspx.cs:line 14&#xD;
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)&#xD;
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)&#xD;
   at System.Web.UI.Control.OnLoad(EventArgs e)&#xD;
   at System.Web.UI.Control.LoadRecursive()&#xD;
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)&#xD;
&#xD;
Additional Info:&#xD;
&#xD;
MachineName : USER&#xD;
TimeStamp : 2011-11-12 5:57:08&#xD;
FullName : Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&#xD;
AppDomainName : 3e5cb21e-3-129655510216406250&#xD;
ThreadIdentity : &#xD;
WindowsIdentity : USER\Petter&#xD;
&#xD;
Category: Exception&lt;/pre&gt;&#xD;
&lt;p&gt;由于我们日志模块我们配置还需要写Rollinglog.log文件,内容如下:&lt;/p&gt;&lt;pre &gt;----------------------------------------&#xD;
Exception Warning: 9000 : Timestamp: 2011-11-12 5:57:08&#xD;
Message: HandlingInstanceID: a99d005d-5f8d-4613-9522-2d60efb089aa&#xD;
An exception of type &lt;span &gt;'System.ArgumentNullException'&lt;/span&gt; occurred and was caught.&#xD;
----------------------------------------------------------------------------&#xD;
11/12/2011 13:57:08&#xD;
Type : System.ArgumentNullException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&#xD;
Message : Value cannot be &lt;span &gt;null&lt;/span&gt;.&#xD;
Parameter name: Demo error&#xD;
Source : MyWeb&#xD;
Help link : &#xD;
ParamName : Demo error&#xD;
Data : System.Collections.ListDictionaryInternal&#xD;
TargetSite : Void Page_Load(System.Object, System.EventArgs)&#xD;
Stack Trace :    at MyWeb.About.Page_Load(Object sender, EventArgs e) &lt;span &gt;in&lt;/span&gt; H:\My Project\DotNet40\TDD2010\WebHost\MyWeb\About.aspx.cs:line 14&#xD;
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)&#xD;
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)&#xD;
   at System.Web.UI.Control.OnLoad(EventArgs e)&#xD;
   at System.Web.UI.Control.LoadRecursive()&#xD;
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)&#xD;
&#xD;
Additional Info:&#xD;
&#xD;
MachineName : USER&#xD;
TimeStamp : 2011-11-12 5:57:08&#xD;
FullName : Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&#xD;
AppDomainName : 3e5cb21e-3-129655510216406250&#xD;
ThreadIdentity : &#xD;
WindowsIdentity : USER\Petter&#xD;
&#xD;
Category: Exception&#xD;
Priority: 0&#xD;
EventId: 9000&#xD;
Severity: Warning&#xD;
Title:Enterprise Library Exception Handling&#xD;
Machine: USER&#xD;
App Domain: 3e5cb21e-3-129655510216406250&#xD;
ProcessId: 2444&#xD;
Process Name: C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\WebDev.WebServer40.exe&#xD;
Thread Name: &#xD;
Win32 ThreadId:2748&#xD;
Extended Properties: &#xD;
----------------------------------------&lt;/pre&gt;&lt;pre &gt;你可以看到上面的EventId=9000与我们之前在CODE中配置是相同的. &lt;br&gt;&lt;/pre&gt;&lt;pre &gt;在开源社区有一个组件&lt;a href="http://code.google.com/p/elmah/" target="_blank"&gt;ELMAH&lt;/a&gt;(Error Logging Modules and Handlers for ASP.NET),已实现Error处理发邮件,写DB,发送到SNS等功能. 我们随意来看下它的代码:&lt;br&gt;它就是基于IHttpModule的扩展,下面代码来ELMAH:&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;    &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;    &lt;span &gt;/// Provides an abstract base class for &amp;lt;see cref="IHttpModule"/&amp;gt; that&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;    &lt;span &gt;/// supports discovery from within partial trust environments.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;    &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;    &lt;span &gt;public&lt;/span&gt; &lt;span &gt;abstract&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; HttpModuleBase : IHttpModule&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   7:  &lt;/span&gt;        &lt;span &gt;void&lt;/span&gt; IHttpModule.Init(HttpApplication context)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   8:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   9:  &lt;/span&gt;            &lt;span &gt;if&lt;/span&gt; (context == &lt;span &gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  10:  &lt;/span&gt;                &lt;span &gt;throw&lt;/span&gt; &lt;span &gt;new&lt;/span&gt; ArgumentNullException(&lt;span &gt;"context"&lt;/span&gt;);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  11:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  12:  &lt;/span&gt;            &lt;span &gt;if&lt;/span&gt; (SupportDiscoverability)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  13:  &lt;/span&gt;                HttpModuleRegistry.RegisterInPartialTrust(context, &lt;span &gt;this&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  14:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  15:  &lt;/span&gt;            OnInit(context);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  16:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  17:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  18:  &lt;/span&gt;        &lt;span &gt;void&lt;/span&gt; IHttpModule.Dispose()&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  19:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  20:  &lt;/span&gt;            OnDispose();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  21:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  22:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  23:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  24:  &lt;/span&gt;        &lt;span &gt;/// Determines whether the module will be registered for discovery&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  25:  &lt;/span&gt;        &lt;span &gt;/// in partial trust environments or not.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  26:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  27:  &lt;/span&gt;        &lt;span &gt;protected&lt;/span&gt; &lt;span &gt;virtual&lt;/span&gt; &lt;span &gt;bool&lt;/span&gt; SupportDiscoverability&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  28:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  29:  &lt;/span&gt;            get { &lt;span &gt;return&lt;/span&gt; &lt;span &gt;false&lt;/span&gt;; }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  30:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  31:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  32:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  33:  &lt;/span&gt;        &lt;span &gt;/// Initializes the module and prepares it to handle requests.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  34:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  35:  &lt;/span&gt;        &lt;span &gt;protected&lt;/span&gt; &lt;span &gt;virtual&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; OnInit(HttpApplication application) {}&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  36:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  37:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  38:  &lt;/span&gt;        &lt;span &gt;/// Disposes of the resources (other than memory) used by the module.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  39:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  40:  &lt;/span&gt;        &lt;span &gt;protected&lt;/span&gt; &lt;span &gt;virtual&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; OnDispose() {}&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  41:  &lt;/span&gt;    }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&lt;pre &gt;这是ErrorLogModule实现之前HttpModuleBase:&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;   1:  &lt;/span&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; ErrorLogModule : HttpModuleBase, IExceptionFiltering&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   3:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;event&lt;/span&gt; ExceptionFilterEventHandler Filtering;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   4:  &lt;/span&gt;        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;event&lt;/span&gt; ErrorLoggedEventHandler Logged;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   5:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   6:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   7:  &lt;/span&gt;        &lt;span &gt;/// Initializes the module and prepares it to handle requests.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;   8:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;   9:  &lt;/span&gt;        &lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  10:  &lt;/span&gt;        &lt;span &gt;protected&lt;/span&gt; &lt;span &gt;override&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; OnInit(HttpApplication application)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  11:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  12:  &lt;/span&gt;            &lt;span &gt;if&lt;/span&gt; (application == &lt;span &gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  13:  &lt;/span&gt;                &lt;span &gt;throw&lt;/span&gt; &lt;span &gt;new&lt;/span&gt; ArgumentNullException(&lt;span &gt;"application"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  14:  &lt;/span&gt;            &lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  15:  &lt;/span&gt;            application.Error += &lt;span &gt;new&lt;/span&gt; EventHandler(OnError);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  16:  &lt;/span&gt;            ErrorSignal.Get(application).Raised += &lt;span &gt;new&lt;/span&gt; ErrorSignalEventHandler(OnErrorSignaled);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  17:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  18:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  19:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  20:  &lt;/span&gt;        &lt;span &gt;/// Gets the &amp;lt;see cref="ErrorLog"/&amp;gt; instance to which the module&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  21:  &lt;/span&gt;        &lt;span &gt;/// will log exceptions.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  22:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  23:  &lt;/span&gt;        &lt;span &gt;protected&lt;/span&gt; &lt;span &gt;virtual&lt;/span&gt; ErrorLog GetErrorLog(HttpContext context)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  24:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  25:  &lt;/span&gt;            &lt;span &gt;return&lt;/span&gt; ErrorLog.GetDefault(context);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  26:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  27:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  28:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  29:  &lt;/span&gt;        &lt;span &gt;/// The handler called when an unhandled exception bubbles up to &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  30:  &lt;/span&gt;        &lt;span &gt;/// the module.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  31:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  32:  &lt;/span&gt;        &lt;span &gt;protected&lt;/span&gt; &lt;span &gt;virtual&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; OnError(&lt;span &gt;object&lt;/span&gt; sender, EventArgs args)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  33:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  34:  &lt;/span&gt;            HttpApplication application = (HttpApplication) sender;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  35:  &lt;/span&gt;            LogException(application.Server.GetLastError(), application.Context);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  36:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  37:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  38:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  39:  &lt;/span&gt;        &lt;span &gt;/// The handler called when an exception is explicitly signaled.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  40:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  41:  &lt;/span&gt;        &lt;span &gt;protected&lt;/span&gt; &lt;span &gt;virtual&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; OnErrorSignaled(&lt;span &gt;object&lt;/span&gt; sender, ErrorSignalEventArgs args)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  42:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  43:  &lt;/span&gt;            LogException(args.Exception, args.Context);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  44:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  45:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  46:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  47:  &lt;/span&gt;        &lt;span &gt;/// Logs an exception and its context to the error log.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  48:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  49:  &lt;/span&gt;        &lt;span &gt;protected&lt;/span&gt; &lt;span &gt;virtual&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; LogException(Exception e, HttpContext context)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  50:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  51:  &lt;/span&gt;            &lt;span &gt;if&lt;/span&gt; (e == &lt;span &gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  52:  &lt;/span&gt;                &lt;span &gt;throw&lt;/span&gt; &lt;span &gt;new&lt;/span&gt; ArgumentNullException(&lt;span &gt;"e"&lt;/span&gt;);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  53:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  54:  &lt;/span&gt;            &lt;span &gt;//&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  55:  &lt;/span&gt;            &lt;span &gt;// Fire an event to check if listeners want to filter out&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  56:  &lt;/span&gt;            &lt;span &gt;// logging of the uncaught exception.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  57:  &lt;/span&gt;            &lt;span &gt;//&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  58:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  59:  &lt;/span&gt;            ExceptionFilterEventArgs args = &lt;span &gt;new&lt;/span&gt; ExceptionFilterEventArgs(e, context);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  60:  &lt;/span&gt;            OnFiltering(args);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  61:  &lt;/span&gt;            &lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  62:  &lt;/span&gt;            &lt;span &gt;if&lt;/span&gt; (args.Dismissed)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  63:  &lt;/span&gt;                &lt;span &gt;return&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  64:  &lt;/span&gt;            &lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  65:  &lt;/span&gt;            &lt;span &gt;//&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  66:  &lt;/span&gt;            &lt;span &gt;// Log away...&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  67:  &lt;/span&gt;            &lt;span &gt;//&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  68:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  69:  &lt;/span&gt;            ErrorLogEntry entry = &lt;span &gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  70:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  71:  &lt;/span&gt;            &lt;span &gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  72:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  73:  &lt;/span&gt;                Error error = &lt;span &gt;new&lt;/span&gt; Error(e, context);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  74:  &lt;/span&gt;                ErrorLog log = GetErrorLog(context);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  75:  &lt;/span&gt;                &lt;span &gt;string&lt;/span&gt; id = log.Log(error);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  76:  &lt;/span&gt;                entry = &lt;span &gt;new&lt;/span&gt; ErrorLogEntry(log, id, error);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  77:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  78:  &lt;/span&gt;            &lt;span &gt;catch&lt;/span&gt; (Exception localException)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  79:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  80:  &lt;/span&gt;                &lt;span &gt;//&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  81:  &lt;/span&gt;                &lt;span &gt;// IMPORTANT! We swallow any exception raised during the &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  82:  &lt;/span&gt;                &lt;span &gt;// logging and send them out to the trace . The idea &lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  83:  &lt;/span&gt;                &lt;span &gt;// here is that logging of exceptions by itself should not &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  84:  &lt;/span&gt;                &lt;span &gt;// be  critical to the overall operation of the application.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  85:  &lt;/span&gt;                &lt;span &gt;// The bad thing is that we catch ANY kind of exception, &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  86:  &lt;/span&gt;                &lt;span &gt;// even system ones and potentially let them slip by.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  87:  &lt;/span&gt;                &lt;span &gt;//&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  88:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  89:  &lt;/span&gt;                Trace.WriteLine(localException);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  90:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  91:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  92:  &lt;/span&gt;            &lt;span &gt;if&lt;/span&gt; (entry != &lt;span &gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  93:  &lt;/span&gt;                OnLogged(&lt;span &gt;new&lt;/span&gt; ErrorLoggedEventArgs(entry));&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  94:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  95:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  96:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  97:  &lt;/span&gt;        &lt;span &gt;/// Raises the &amp;lt;see cref="Logged"/&amp;gt; event.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;  98:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;  99:  &lt;/span&gt;        &lt;span &gt;protected&lt;/span&gt; &lt;span &gt;virtual&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; OnLogged(ErrorLoggedEventArgs args)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 100:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt; 101:  &lt;/span&gt;            ErrorLoggedEventHandler handler = Logged;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 102:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt; 103:  &lt;/span&gt;            &lt;span &gt;if&lt;/span&gt; (handler != &lt;span &gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 104:  &lt;/span&gt;                handler(&lt;span &gt;this&lt;/span&gt;, args);&lt;/pre&gt;&lt;pre &gt;&lt;span &gt; 105:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 106:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt; 107:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 108:  &lt;/span&gt;        &lt;span &gt;/// Raises the &amp;lt;see cref="Filtering"/&amp;gt; event.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt; 109:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 110:  &lt;/span&gt;        &lt;span &gt;protected&lt;/span&gt; &lt;span &gt;virtual&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; OnFiltering(ExceptionFilterEventArgs args)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt; 111:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 112:  &lt;/span&gt;            ExceptionFilterEventHandler handler = Filtering;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt; 113:  &lt;/span&gt;            &lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 114:  &lt;/span&gt;            &lt;span &gt;if&lt;/span&gt; (handler != &lt;span &gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre &gt;&lt;span &gt; 115:  &lt;/span&gt;                handler(&lt;span &gt;this&lt;/span&gt;, args);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 116:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt; 117:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 118:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt; 119:  &lt;/span&gt;        &lt;span &gt;/// Determines whether the module will be registered for discovery&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 120:  &lt;/span&gt;        &lt;span &gt;/// in partial trust environments or not.&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt; 121:  &lt;/span&gt;        &lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 122:  &lt;/span&gt;        &lt;span &gt;protected&lt;/span&gt; &lt;span &gt;override&lt;/span&gt; &lt;span &gt;bool&lt;/span&gt; SupportDiscoverability&lt;/pre&gt;&lt;pre &gt;&lt;span &gt; 123:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 124:  &lt;/span&gt;            get { &lt;span &gt;return&lt;/span&gt; &lt;span &gt;true&lt;/span&gt;; }&lt;/pre&gt;&lt;pre &gt;&lt;span &gt; 125:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span &gt; 126:  &lt;/span&gt;    }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&lt;pre &gt;更多的功能等待您去挖掘,我们在实际开发中按需选择.希望这篇POST对您开发有帮助.&lt;br&gt;&lt;br&gt;你可能感兴趣的文章:&lt;/pre&gt;&lt;pre &gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2011/03/09/1978472.html"&gt;在VS2010中配制Elmah邮件发送到Gmail&lt;/a&gt;&lt;/pre&gt;&lt;pre &gt;HttpModule应用:&lt;br&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2009/09/06/1561161.html"&gt;使用HttpModules实现Asp.net离线应用程序&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2011/11/06/2237983.html"&gt;Asp.net使用HttpModule压缩并删除空白Html请求&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2011/08/07/2129942.html"&gt;Asp.net移除Server, X-Powered-By, 和X-AspNet-Version头&lt;/a&gt;&lt;/pre&gt;&lt;pre &gt;Enterprise Library:&lt;br&gt;&lt;br&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2010/12/14/1905355.html"&gt;使用Fluent配置API驱动Enterprise Library 5.0&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2010/04/27/1722234.html"&gt;EneterpriseLibrary5的Fluent配制API&lt;/a&gt;&lt;/pre&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;div id="AllanboltSignature"&gt;&#xD;
&lt;p id="PSignature" style="border-right: #e0e0e0 1px dashed; padding-right: 10px; border-top: #e0e0e0 1px dashed; padding-left: 60px; font-size: 12px; padding-bottom: 10px; border-left: #e0e0e0 1px dashed; padding-top: 10px; border-bottom: #e0e0e0 1px dashed; font-family: 微软雅黑"&gt;&lt;br&gt;作者：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;Petter Liu&lt;/a&gt; &lt;br&gt;出处：&lt;a href="http://www.cnblogs.com/wintersun/" target="_blank"&gt;http://www.cnblogs.com/wintersun/&lt;/a&gt; &lt;br&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 &lt;br&gt;该文章也同时发布在我的独立博客中-&lt;a href="http://www.cnblogs.com/wintersun/"&gt;Petter Liu Blog&lt;/a&gt;。 &lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/wintersun/aggbug/2246513.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wintersun/archive/2011/11/12/2246513.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
