﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-lulu Studio</title><link>http://www.cnblogs.com/QLeelulu/</link><description>我的Flash站</description><language>zh-cn</language><lastBuildDate>Sat, 11 Oct 2008 04:20:13 GMT</lastBuildDate><pubDate>Sat, 11 Oct 2008 04:20:13 GMT</pubDate><ttl>60</ttl><item><title>ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)</title><link>http://www.cnblogs.com/QLeelulu/archive/2008/10/09/1307660.html</link><dc:creator>Q.Lee.lulu</dc:creator><author>Q.Lee.lulu</author><pubDate>Thu, 09 Oct 2008 15:38:00 GMT</pubDate><guid>http://www.cnblogs.com/QLeelulu/archive/2008/10/09/1307660.html</guid><wfw:comment>http://www.cnblogs.com/QLeelulu/comments/1307660.html</wfw:comment><comments>http://www.cnblogs.com/QLeelulu/archive/2008/10/09/1307660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/QLeelulu/comments/commentRss/1307660.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/QLeelulu/services/trackbacks/1307660.html</trackback:ping><description><![CDATA[<p>本系列文章基于ASP.NET MVC Preview5.
<p>有时候你想在调用action方法之前或者action方法之后处理一些逻辑，为了支持这个，ASP.NET MVC允许你创建action过滤器。Action过滤器是自定义的Attributes，用来标记添加Action方法之前或者Action方法之后的行为到控制器类中的Action方法中。
<p>一些可能用到Action过滤器的地方有：
<ul>
    <li>日志,异常处理</li>
    <li>身份验证和授权 － 限制用户的访问</li>
    <li>输出缓存 － 保存一个Action的结果</li>
    <li>网络爬虫的过滤</li>
    <li>本地化</li>
    <li>动态Action － 将一个Action注入到控制器中</li>
</ul>
<p>ASP.NET MVC为我们提供了下面的几个Filter接口：</p>
</li>
<li><code><code>IActionFilter</code></code></li>
<li><code>IAuthorizationFilter</code></li>
<li><code>IExceptionFilter</code></li>
<li><code><code>IResultFilter</code></code>
<p>要实现一个Filter，我们需要继承自<font color="#008000">FilterAttribute</font>类同时实现上面的一个或几个接口：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyFilter&nbsp;:&nbsp;FilterAttribute,&nbsp;IActionFilter,&nbsp;IResultFilter<br />
{<br />
}&nbsp;</span></div>
<p>&nbsp;
<p>这几个接口提供的方法如下：
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC9ActionFilterFilter_13252/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="108" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC9ActionFilterFilter_13252/image_thumb.png" width="476" border="0" /></a>
<p>上图的方法和Filter接口对应的方法按名称对号入座就可以。
<p><code><code>IActionFilter</code></code>接口有两个方法：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC9ActionFilterFilter_13252/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="93" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC9ActionFilterFilter_13252/image_thumb_1.png" width="550" border="0" /></a> </p>
<p>其中OnActionExecuting在执行Action方法之前会被调用，OnActionExecuted会在Action方法执行后调用。注意他们的参数分别是ActionExecut<font color="#ff0000">ing</font>Context和ActionExecut<font color="#ff0000">ed</font>Context。</p>
<p>ActionExecut<font color="#ff0000">ed</font>Context类包含一个 <strong>Canceled</strong>的属性，允许你取消当前的Action(怎么原来在P3中是在ActionExecut<font color="#ff0000">ing</font>Context的<strong>Canceled</strong>属性在P5中没有了呢？神奇.那么在OnActionExecuting的时候怎么取消一个Action呢？)。</p>
<p>FilterExcut<strong>ed</strong>Context 类包含一个Exception属性和一个ExceptionHandled属性。如果Exception属性为null，则没有异常在action stack中，表明Action方法运行并没有发生错误。反之则为出现异常。如果将ExceptionHandled属性设置为true则表明在这个Filter中已经处理了异常。
<p><code><code>IResultFilter接口也提供了两个方法：</code></code>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC9ActionFilterFilter_13252/image_6.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="97" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC9ActionFilterFilter_13252/image_thumb_2.png" width="550" border="0" /></a>
<p>他们分别在Action返回结果(例如return View();)之前和之后执行。和<code><code>IActionFilter</code></code>差不多就不多说了。
<p><code>IAuthorizationFilter</code>是一个用于身份验证的Filter。只提供了一个void OnAuthorization(AuthorizationContext filterContext)方法。
<p><code>IExceptionFilter</code>会在出现异常的时候调用，也是只 提供一个void OnException(ExceptionContext filterContext)的方法；
<p>这些Filter可以被应用在类或者方法上，下面我们来看一下他们的执行顺序。首先我们写一个BaseController并加上两个Filter： </p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">[MyFilter2(Target&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">BaseController</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
[MyFilter1(Target</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">BaseController</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;BaseController&nbsp;:&nbsp;Controller<br />
{&nbsp;<br />
}&nbsp;</span></div>
<p>&nbsp;
<p>应为Controller类是实现这几个Filter接口的，所以我们在HomeController中重写Controller基类中的所有Filter接口的方法，并在HomeController类和里面的Filter方法加上我们自定义的MyFilter： </p>
<div class="cnblogs_code"><img id="Code_Closed_Image_233946" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_233946').style.display='none'; document.getElementById('Code_Open_Image_233946').style.display='inline'; document.getElementById('Code_Open_Text_233946').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_233946" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_233946').style.display='none'; getElementById('Code_Closed_Image_233946').style.display='inline'; getElementById('Code_Closed_Text_233946').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_233946">HomeController</span><span id="Code_Open_Text_233946" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">[MyFilter2(Target&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">HomeController</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #008000">//</span><span style="color: #008000">[MyFilter1(Target&nbsp;=&nbsp;"HomeController")]</span><span style="color: #008000">//</span><span style="color: #008000">注意我在这里把MyFilter1注释了.</span><span style="color: #008000"><br />
</span><span style="color: #000000">[HandleError]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HomeController&nbsp;:&nbsp;BaseController<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;[MyFilter2(Target&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">HomeController.Filter</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;[MyFilter1(Target&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">HomeController.Filter</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ActionResult&nbsp;Filter()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;Content(</span><span style="color: #800000">"</span><span style="color: #800000">&lt;div&gt;这是在Action方法里面返回的内容！&lt;/div&gt;</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnActionExecuted(ActionExecutedContext&nbsp;filterContext)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterContext.HttpContext.Response.Write(</span><span style="color: #800000">"</span><span style="color: #800000">&lt;div&gt;这是在HomeController里面重写OnActionExecuted方法添加的内容！&lt;/div&gt;</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnActionExecuting(ActionExecutingContext&nbsp;filterContext)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterContext.HttpContext.Response.Write(</span><span style="color: #800000">"</span><span style="color: #800000">&lt;div&gt;这是在HomeController里面重写OnActionExecuting方法添加的内容！&lt;/div&gt;</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnAuthorization(AuthorizationContext&nbsp;filterContext)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterContext.HttpContext.Response.Write(</span><span style="color: #800000">"</span><span style="color: #800000">&lt;div&gt;这是在HomeController里面重写OnAuthorization方法添加的内容！&lt;/div&gt;</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnException(ExceptionContext&nbsp;filterContext)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterContext.HttpContext.Response.Write(</span><span style="color: #800000">"</span><span style="color: #800000">&lt;div&gt;这是在HomeController里面重写OnException方法添加的内容！&lt;/div&gt;</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterContext.ExceptionHandled&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnResultExecuted(ResultExecutedContext&nbsp;filterContext)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterContext.HttpContext.Response.Write(</span><span style="color: #800000">"</span><span style="color: #800000">&lt;div&gt;这是在HomeController里面重写OnResultExecuted方法添加的内容！&lt;/div&gt;</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnResultExecuting(ResultExecutingContext&nbsp;filterContext)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterContext.HttpContext.Response.Write(</span><span style="color: #800000">"</span><span style="color: #800000">&lt;div&gt;这是在HomeController里面重写OnResultExecuting方法添加的内容！&lt;/div&gt;</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}&nbsp;</span></span></div>
<p>然后我们运行一下看看结果如何：
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC9ActionFilterFilter_13252/image_10.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="535" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC9ActionFilterFilter_13252/image_thumb_4.png" width="598" border="0" /></a> </p>
<p>从运行结果我们可以看到，在Controller中重写的Filter会最先执行，然后到应用在类上的Filter，然后再到应用在类方法上的Filter。</p>
<p>而4个接口的方法执行顺序如下：<code>IAuthorizationFilter -&gt; </code><code><code>IActionFilter -&gt;</code></code>&nbsp;<code><code>IResultFilter -&gt;</code></code>&nbsp;<code>IExceptionFilter</code> .</p>
<p>而对于同一个Filter，例如<code>IAuthorizationFilter在MyFilter1和MyFilter2里里面的实现，又根据他们的加载顺序不同而不同。</code>
<p><code>在BaseController中应用的Filter会被子类继承，如果子类又应用了和基类同样的Filter，则会不执行基类的Filter。例如上面的HomeController应用了MyFilter2，所以调用HomeController的MyFilter2，而不是BaseController的MyFilter2。</code>
<p><code>这个执行顺序还得大家好好研究才能了解的。</code>
<p><code>同时FilterAttribute还提供了一个Order的属性，用于指定Filter的执行顺序。</code>
<p>每一个Action过滤器都有一个 Order 属性，用来决定Action过滤器在该范围内的执行顺序。Order属性必需是0(默认值)或者更大的整数值。省略Order属性则会给该过滤器的Order值为 -1, 表明未指明顺序。任何一个在同一范围的Action过滤器Order设为 -1 的都将按不确定的顺序执行，但在此之前过滤器有一个特定的顺序(请参考上图).
<p>当设置Order属性的值的时候，必需指定一个唯一的值。如果两个或者更多的Action过滤器具有相同的Order属性值，将会抛出一个异常。
<p>来看一个示例： </p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">[Filter1(Order&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">2</span><span style="color: #000000">)]<br />
[Filter2(Order&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">3</span><span style="color: #000000">)]<br />
[Filter3(Order&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Index()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;RenderView(</span><span style="color: #800000">"</span><span style="color: #800000">Index</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
}&nbsp;</span></div>
<p>&nbsp;
<p>Filter的执行顺序为：Filter3 =&gt; Filter1 =&gt; Filter2.
<p>暂时就写这么多吧，这一部分主要介绍概念。Enjoy！Post by <a href="http://www.cnblogs.com/QLeelulu/">Q.Lee.lulu</a>。
<p>本文的Blog程序示例代码： <a href="http://files.cnblogs.com/QLeelulu/ActionFilter.rar">ActionFilter.rar</a>
<p>---------------------------------------------------------------------
<p>更多内容，请关注<a href="http://blog.51mvc.com/">http://blog.51mvc.com/</a> 和 <a href="http://bbs.51mvc.com/">http://bbs.51mvc.com/</a> </p>
</li>
<img src ="http://www.cnblogs.com/QLeelulu/aggbug/1307660.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42936/" target="_blank">[新闻]金融风暴改写富豪榜排名　巴菲特资产超盖茨</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>ASP.NET MVC 入门8、ModelState与数据验证</title><link>http://www.cnblogs.com/QLeelulu/archive/2008/10/08/1305962.html</link><dc:creator>Q.Lee.lulu</dc:creator><author>Q.Lee.lulu</author><pubDate>Wed, 08 Oct 2008 00:25:00 GMT</pubDate><guid>http://www.cnblogs.com/QLeelulu/archive/2008/10/08/1305962.html</guid><wfw:comment>http://www.cnblogs.com/QLeelulu/comments/1305962.html</wfw:comment><comments>http://www.cnblogs.com/QLeelulu/archive/2008/10/08/1305962.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/QLeelulu/comments/commentRss/1305962.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/QLeelulu/services/trackbacks/1305962.html</trackback:ping><description><![CDATA[摘要: ViewData有一个ModelState的属性，这是一个类型为ModelStateDictionary的ModelState类型的字典集合。在进行数据验证的时候这个属性是比较有用的。在使用Html.ValidationMessage()的时候，就是从ViewData.ModelState中检测是否有指定的KEY，如果存在，就提示错误信息。例如在前一篇文章ASP.NET MVC 入门7、Hellp&nbsp;&nbsp;<a href='http://www.cnblogs.com/QLeelulu/archive/2008/10/08/1305962.html'>阅读全文</a><img src ="http://www.cnblogs.com/QLeelulu/aggbug/1305962.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42935/" target="_blank">[新闻]红杉资本发出严重警告：黄金时代已成历史</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>ASP.NET MVC 入门系列</title><link>http://www.cnblogs.com/QLeelulu/archive/2008/10/05/1303997.html</link><dc:creator>Q.Lee.lulu</dc:creator><author>Q.Lee.lulu</author><pubDate>Sat, 04 Oct 2008 16:33:00 GMT</pubDate><guid>http://www.cnblogs.com/QLeelulu/archive/2008/10/05/1303997.html</guid><wfw:comment>http://www.cnblogs.com/QLeelulu/comments/1303997.html</wfw:comment><comments>http://www.cnblogs.com/QLeelulu/archive/2008/10/05/1303997.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cnblogs.com/QLeelulu/comments/commentRss/1303997.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/QLeelulu/services/trackbacks/1303997.html</trackback:ping><description><![CDATA[<p>一个居于ASP.NET MVC Preview5的系列入门文章，有朋友提议说写一个示例程序来同步讲解，那样更加容易学习。所以就写选择了写一个Blog程序来作为示例程序。</p>
<p>本系列文章可能会是几位朋友来共同完成的。</p>
<p>文章列表,不定时更新：</p>
<p><a href="http://www.cnblogs.com/QLeelulu/archive/2008/09/30/1302462.html">ASP.NET MVC 入门1、简介</a></p>
<p><a href="http://www.cnblogs.com/QLeelulu/archive/2008/10/03/1303521.html">ASP.NET MVC 入门2、项目的目录结构与核心的DLL</a></p>
<p><a href="http://www.cnblogs.com/QLeelulu/archive/2008/10/03/1303612.html">ASP.NET MVC 入门3、Routing</a></p>
<p><a href="http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303672.html">ASP.NET MVC 入门4、Controller与Action</a></p>
<p><a href="http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303913.html">ASP.NET MVC 入门5、View与ViewData</a></p>
<p><a href="http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303948.html">ASP.NET MVC 入门6、TempData</a></p>
<p><a href="http://www.cnblogs.com/QLeelulu/archive/2008/10/05/1303991.html">ASP.NET MVC 入门7、Hellper与数据的提交与绑定</a></p>
<p><a class="postTitle2" id="AjaxHolder_ctl01_TitleUrl" style="background-color: rgb(255,255,224)" href="http://www.cnblogs.com/QLeelulu/archive/2008/10/08/1305962.html" jquery1223426656937="13" fade="58515084">ASP.NET MVC 入门8、ModelState与数据验证</a></p>
<p><a class="postTitle2" id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/QLeelulu/archive/2008/10/09/1307660.html" fade="247656362" jquery1223567133031="13">ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)</a></p>
<p>&nbsp;</p>
<p>最新的Blog示例程序代码：<a href="http://files.cnblogs.com/QLeelulu/4mvcBlog_8.rar">4mvcBlog_8.rar</a></p>
<p>---------------------------------------------------------------------
<p>更多内容，请关注<a href="http://blog.51mvc.com/">http://blog.51mvc.com/</a> 和 <a href="http://bbs.51mvc.com/">http://bbs.51mvc.com/</a></p>
<img src ="http://www.cnblogs.com/QLeelulu/aggbug/1303997.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42934/" target="_blank">[新闻]2008年10月11日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>ASP.NET MVC 入门7、Hellper与数据的提交与绑定</title><link>http://www.cnblogs.com/QLeelulu/archive/2008/10/05/1303991.html</link><dc:creator>Q.Lee.lulu</dc:creator><author>Q.Lee.lulu</author><pubDate>Sat, 04 Oct 2008 16:16:00 GMT</pubDate><guid>http://www.cnblogs.com/QLeelulu/archive/2008/10/05/1303991.html</guid><wfw:comment>http://www.cnblogs.com/QLeelulu/comments/1303991.html</wfw:comment><comments>http://www.cnblogs.com/QLeelulu/archive/2008/10/05/1303991.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/QLeelulu/comments/commentRss/1303991.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/QLeelulu/services/trackbacks/1303991.html</trackback:ping><description><![CDATA[<p>本系列文章基于ASP.NET MVC Preview5.</p>
<p>ASP.NET MVC提供了很多Hellper的方法，Hellper就是一些生成HTML代码的方法，方便我们书写HTML代码(有一部分的朋友更喜欢直接写HTML代码)。我们也可以利用.NET 3.5的扩展方法来书写我们自己的Hellper。</p>
<p>例如：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">Html.ActionLink(</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #800000; background-color: #f5f5f5">首页</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">,</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #800000; background-color: #f5f5f5">index</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">,</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #800000; background-color: #f5f5f5">Home</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">)</span><span style="color: #000000; background-color: #ffff00">%&gt;</span></div>
<p>生成的HTML代码就是：&lt;a href="/Home/Index"&gt;首页&lt;/a&gt;。这里有一点需要注意的就是，<font color="#ff0000">Html.ActionLink()和Url.Link()方法生成的URL和你在Global.asax里面配置的Route的先后顺序是有关的</font>。</p>
<p>具体的关于Hellper的各个方法的使用我就不详细介绍了，你可以参考<a href="http://www.cnblogs.com/chsword/">重典</a>的<a href="http://www.cnblogs.com/chsword/archive/2008/03/10/1099474.html">Asp.net Mvc Framework 系列</a>文章。</p>
<p>我们来实现前面提到的Setting，用于设置Blog的基本设置。我们看一下在Views/Admin/Setting.aspx页面的代码：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">label&nbsp;</span><span style="color: #ff0000">for</span><span style="color: #0000ff">="Name"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Blog的名称</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">label</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">Html.TextBox(</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #800000; background-color: #f5f5f5">Name</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">)</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">Html.ValidationMessage(</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #800000; background-color: #f5f5f5">Name</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">)</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">label&nbsp;</span><span style="color: #ff0000">for</span><span style="color: #0000ff">="Description"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Blog的简单描述</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">label</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">Html.TextArea(</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #800000; background-color: #f5f5f5">Description</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">)</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">Html.ValidationMessage(</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #800000; background-color: #f5f5f5">Description</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">)</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">label&nbsp;</span><span style="color: #ff0000">for</span><span style="color: #0000ff">="PostsPerPage"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">每页显示的日志数</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">label</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">Html.TextBox(</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #800000; background-color: #f5f5f5">PostsPerPage</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">)</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">Html.ValidationMessage(</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #800000; background-color: #f5f5f5">PostsPerPage</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">)</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
<p>&nbsp;
<p>我们的Setting Action方法是这样写的：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC7HtmlHellper_21C/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="96" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC7HtmlHellper_21C/image_thumb.png" width="337" border="0" /></a> </p>
<p>注意我们是return View(BlogSettings.Instance);给ViewData.Model传递了BlogSettings.Instance。然后运行一下看看：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC7HtmlHellper_21C/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="317" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC7HtmlHellper_21C/image_thumb_1.png" width="471" border="0" /></a> </p>
<p>注意到上面的TextBox都有值了么？我们使用了Html.TextBox("Name")而已，并没有指定值啊？那么这个值是怎么自动的绑定上去的呢？注意到前面在Action中我们是return View(BlogSettings.Instance);给ViewData.Model传递了BlogSettings.Instance，BlogSettings.Instance.Name和Html.TextBox("Name")的参数"Name"同名，Html.TextBox()方法在调用的时候会调用ViewData.Eval()方法，所以就自动把值绑定上去了。和前一篇文章说过的ViewData.Eval()可以使用"."表达式一样，Html.TextBox()也同样可以使用"."表达式，例如：Html.TextBox("Post.Title")也可以自动绑定ViewData.Model.Post.Title值上去。</p>
<p>下面我们来将值提交到Action中并保存。我们的Form使用了Post回服务器：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;</span><span style="color: #800000">form&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="fields"</span><span style="color: #ff0000">&nbsp;action</span><span style="color: #0000ff">="&lt;%=Url.Action("</span><span style="color: #ff0000">Setting","Admin")%</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">"&nbsp;method="post"&gt;</span></div>
<p>&nbsp;</p>
<p>然后我们在Action中进行处理：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">[ActionName(</span><span style="color: #800000">"</span><span style="color: #800000">Setting</span><span style="color: #800000">"</span><span style="color: #000000">),&nbsp;AcceptVerbs(</span><span style="color: #800000">"</span><span style="color: #800000">POST</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ActionResult&nbsp;SaveSetting()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">当然你可以这样取值<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">string&nbsp;name&nbsp;=&nbsp;Request.Form["Name"];&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">但我们有更简便的：</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdateModel(BlogSettings.Instance,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">[]&nbsp;{&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Name</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Description</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">PostsPerPage</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;View(BlogSettings.Instance);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在这里你可能还需要对自定义的业务逻辑进行验证&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;BlogSettings.Instance.Save();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;ShowMsg(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">()&nbsp;{&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">修改设置成功</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;});<br />
}&nbsp;</span></div>
<p>如上代码所示，我们可以使用UpdateModel()方法直接对Post到服务器来的Form表单的值赋给指定的对象。对于提交的数据进行业务逻辑的验证这里要讨论的还是比较多的，国外也有不少文章讨论这个的，大家可以搜索看看。
<p>暂时就写这么多吧，想到什么再补充。Enjoy！Post by <a href="http://www.cnblogs.com/QLeelulu/">Q.Lee.lulu</a>。 </p>
<p>本文的Blog程序示例代码：<a href="http://files.cnblogs.com/QLeelulu/4mvcBlog_7.rar">4mvcBlog_7.rar</a></p>
<p>---------------------------------------------------------------------
<p>更多内容，请关注<a href="http://blog.51mvc.com/">http://blog.51mvc.com/</a> 和 <a href="http://bbs.51mvc.com/">http://bbs.51mvc.com/</a></p>
<img src ="http://www.cnblogs.com/QLeelulu/aggbug/1303991.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42934/" target="_blank">[新闻]2008年10月11日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>ASP.NET MVC 入门6、TempData</title><link>http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303948.html</link><dc:creator>Q.Lee.lulu</dc:creator><author>Q.Lee.lulu</author><pubDate>Sat, 04 Oct 2008 14:00:00 GMT</pubDate><guid>http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303948.html</guid><wfw:comment>http://www.cnblogs.com/QLeelulu/comments/1303948.html</wfw:comment><comments>http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/QLeelulu/comments/commentRss/1303948.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/QLeelulu/services/trackbacks/1303948.html</trackback:ping><description><![CDATA[<p>本系列文章基于ASP.NET MVC Preview5.</p>
<p>ASP.NET MVC的TempData用于传输一些临时的数据，例如在各个控制器Action间传递临时的数据或者给View传递一些临时的数据，相信大家都看过&#8220;在ASP.NET页面间传值的方法有哪几种&#8221;这个面试题，在ASP.NET MVC中TempData的就是其中的一种传值方法。TempData默认是使用Session来存储临时数据的，TempData中存放的数据只一次访问中有效，一次访问完后就会删除了的。这个一次访问指的是一个请求到下一个请求，因为在下一个请求到来之后，会从Session中取出保存在里面的TempData数据并赋值给TempData，然后将数据从Session中删除。我们看一下ASP.NET MVC Preview5源码：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC6TempData_12D9A/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="203" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC6TempData_12D9A/image_thumb.png" width="750" border="0" /></a> </p>
<p>也就是说TempData只保存到下一个请求中，下一个请求完了之后，TempData就会被删除了。注意这里TempData使用Session来做存储的，Session是对应特定用户的，所以并不存在并发问题。如果你用数据库来做TempData的存储介质的话，必须要考虑这个情况的。至于如何自定义TempData的存储介质，你可以参考&#8220;<a href="http://www.cnblogs.com/QLeelulu/archive/2008/09/19/1294469.html">ASP.NET MVC: 用db4o来做TempDataProvider(另附一个泛型的RedirectToAction方法)</a>&#8221;这一篇文章。</p>
<p>前面说到的在我们的BaseController中有一个显示提示信息给用户的方法，这个提示信息就是临时的信息，我们可以使用TempData来实现。下面让我们来实现这个提示信息的方法：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;ActionResult&nbsp;ShowMsg(List</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;msgs)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;TempData[</span><span style="color: #800000">"</span><span style="color: #800000">Messages</span><span style="color: #800000">"</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;msgs;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;RedirectToAction(</span><span style="color: #800000">"</span><span style="color: #800000">Message</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
}&nbsp;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ActionResult&nbsp;Message()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;View(TempData[</span><span style="color: #800000">"</span><span style="color: #800000">Messages</span><span style="color: #800000">"</span><span style="color: #000000">]&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">);<br />
}</span></div>
<p>&nbsp;
<p>因为我们的Controller都继承自这个我们自定义的BaseController，所以我么可以才Controller中这样来给用户显示提示信息：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC6TempData_12D9A/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="106" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC6TempData_12D9A/image_thumb_1.png" width="583" border="0" /></a> </p>
<p>好，这一部分就先到这里吧。Enjoy！Post by <a href="http://www.cnblogs.com/QLeelulu/">Q.Lee.lulu</a>。
<p>本文示例Blog的代码：<a href="http://files.cnblogs.com/QLeelulu/4mvcBlog_5.rar">4mvcBlog_5.rar</a>
<p>---------------------------------------------------------------------
<p>更多内容，请关注<a href="http://blog.51mvc.com/">http://blog.51mvc.com/</a> 和 <a href="http://bbs.51mvc.com/">http://bbs.51mvc.com/</a></p>
<img src ="http://www.cnblogs.com/QLeelulu/aggbug/1303948.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42933/" target="_blank">[新闻]搞死开心网还是搞活他？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>ASP.NET MVC 入门5、View与ViewData</title><link>http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303913.html</link><dc:creator>Q.Lee.lulu</dc:creator><author>Q.Lee.lulu</author><pubDate>Sat, 04 Oct 2008 12:50:00 GMT</pubDate><guid>http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303913.html</guid><wfw:comment>http://www.cnblogs.com/QLeelulu/comments/1303913.html</wfw:comment><comments>http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/QLeelulu/comments/commentRss/1303913.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/QLeelulu/services/trackbacks/1303913.html</trackback:ping><description><![CDATA[<p>本系列文章基于ASP.NET MVC Preview5.</p>
<p>view在MVC模式中与用户进行最直接的接触，它负责数据的呈现。这里要注意一点就是，view只是负责数据的呈现，所以我们应该要尽量让view中不涉及业务逻辑的处理。</p>
<p>我们来添加一个Blog首页的view。在安装了ASP.NET MVC后，我们在添加新项目的时候可以看到有MVC的view模板：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="373" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_thumb.png" width="690" border="0" /></a>&nbsp;<br />
<em>注：如果你的是中文版的VS，安装完后可能会出现找不到这个模板的现象，你可以参考</em><a href="http://www.cnblogs.com/QLeelulu/archive/2008/03/06/1093526.html"><em>在中文版VS 08中安装MVC</em></a><em>这篇文章设置一下。</em></p>
<p>其中MVC View Content Page是有母版页的。我们在Views/Home目录下添加一个MVC View Content Page，并选择我们Views/Shared目录下的Site.Master母版页：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">partial</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000"> Index : ViewPage<br />
{<br />
}</span></div>
<p>ASP.NET MVC默认是使用WebForm来作为view的。所以我们看到新建的aspx页面继承自ViewPage，如果使用aspx页面作为ASP.NET MVC的视图引擎，则所有的aspx页面都必须继承自ViewPage。我们再看一下ViewPage：
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_6.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="291" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_thumb_2.png" width="573" border="0" /></a> </p>
<p>我们看到ViewPage继承自ASP.NET WebForm的Page页，还实现了IViewDataContainer接口，同时还提供了一些Helper类的实例。我们可以使用ViewData来从Controller中往view页面中传递数据。下面我们在HomeController中的Index Action中取出Posts列表，然后在View中显示。我们先在Controller中取出数据，前面说过，为了方便，我们会直接使用BlogEngine的Model层来作为我们这个4mvcBlog的Model。所以我们的代码如下：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000"> ActionResult Index(</span><span style="color: #0000ff">int</span><span style="color: #000000">?</span><span style="color: #000000"> id)<br />
{<br />
&nbsp;&nbsp;&nbsp; ViewData[</span><span style="color: #800000">"</span><span style="color: #800000">Title</span><span style="color: #800000">"</span><span style="color: #000000">] </span><span style="color: #000000">=</span><span style="color: #000000"> BlogSettings.Instance.Name; <br />
<br />
&nbsp;&nbsp;&nbsp; List</span><span style="color: #000000">&lt;</span><span style="color: #000000">IPublishable</span><span style="color: #000000">&gt;</span><span style="color: #000000"> posts </span><span style="color: #000000">=</span><span style="color: #000000"> BlogEngine.Core.Post.Posts<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ConvertAll(</span><span style="color: #0000ff">new</span><span style="color: #000000"> Converter</span><span style="color: #000000">&lt;</span><span style="color: #000000">Post, IPublishable</span><span style="color: #000000">&gt;</span><span style="color: #000000">(</span><span style="color: #0000ff">delegate</span><span style="color: #000000">(Post p) { </span><span style="color: #0000ff">return</span><span style="color: #000000"> p </span><span style="color: #0000ff">as</span><span style="color: #000000"> IPublishable; })); <br />
<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">int</span><span style="color: #000000"> pageIndex </span><span style="color: #000000">=</span><span style="color: #000000"> (id </span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"> id.HasValue </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"> id.Value </span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">) </span><span style="color: #000000">?</span><span style="color: #000000"> id.Value : </span><span style="color: #800080">1</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">int</span><span style="color: #000000"> pageSize </span><span style="color: #000000">=</span><span style="color: #000000"> Math.Min(posts.Count, BlogSettings.Instance.PostsPerPage);<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">if</span><span style="color: #000000"> ((pageIndex </span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">) </span><span style="color: #000000">*</span><span style="color: #000000"> pageSize </span><span style="color: #000000">+</span><span style="color: #000000"> pageSize </span><span style="color: #000000">&gt;</span><span style="color: #000000"> posts.Count)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000"> ShowMsg(</span><span style="color: #0000ff">new</span><span style="color: #000000"> List</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">() { </span><span style="color: #800000">"</span><span style="color: #800000">页码超出范围</span><span style="color: #800000">"</span><span style="color: #000000"> });<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; posts </span><span style="color: #000000">=</span><span style="color: #000000"> posts.GetRange((pageIndex </span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">) </span><span style="color: #000000">*</span><span style="color: #000000"> pageSize, pageSize); <br />
<br />
&nbsp;&nbsp;&nbsp; ViewData[</span><span style="color: #800000">"</span><span style="color: #800000">Posts</span><span style="color: #800000">"</span><span style="color: #000000">] </span><span style="color: #000000">=</span><span style="color: #000000"> posts; </span><span style="color: #008000">//</span><span style="color: #008000">向ViewData中传数据 <br />
<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000">这里返回View给客户端，如果不指定要返回的View的名称，<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000">就是返回和Action同名的View，<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000">也就是相当于return View("Index");</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000"> View();<br />
}</span></div>
<p>默认的WebFormView搜索View的顺序是按如下顺序搜索的：
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_9.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="142" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_thumb_1.png" width="370" border="0" /></a>
<p>其中{1}为ControllerName，{0}为ActionName。MasterLocationFormats为母版页的搜索顺序。
<p>
<p>在上面的代码中我们使用ViewData["Posts"]向View页面传递数据，然后我们就可以在View中取出数据并呈现给用户，Views/Home/Index.aspx页面的部分代码如下：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_8.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="264" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_thumb_3.png" width="610" border="0" /></a> </p>
<p>如上红色框中的代码，我们可以从ViewData中取出数据，并转换为相应的类型。在这里我们发现ViewData要做一个类型的转换，其实我们可以将ViewData.Model设置为强类型，只需将我们的View页面继承自ViewPage&lt;TModel&gt;就可以了：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_14.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="64" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_thumb_6.png" width="609" border="0" /></a> </p>
<p>然后在Controller里面return View()的时候直接给ViewData.Model传值，如下所示：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_12.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="101" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_thumb_5.png" width="525" border="0" /></a> </p>
<p>然后在View中我们可以直接从强类型的ViewData.Model中取值：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_16.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="265" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC5ViewViewData_11CDE/image_thumb_7.png" width="742" border="0" /></a> </p>
<p>由上面的代码我看可以看出ViewData.Model就是List&lt;IPublishable&gt;类型，并不需要再进行类型的转换。</p>
<p>ViewData还有一个Eval的方法，我们可以使用这个方法从ViewData中取值。假如我么在Action中使用return View(Post);给View传递一篇日志的数据。而Post有一个Previous的属性指向前一篇日志，则我们可以在View页面中可以这样来取值：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> ViewData.Eval(</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #800000; background-color: #f5f5f5">Previous.Title</span><span style="color: #800000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">)</span><span style="color: #000000; background-color: #ffff00">%&gt;</span></div>
<p>但是如果使用我最后提供的示例Blog程序的代码这样在取值的时候直接在里面使用"<font color="#ff0000">.</font>"来取值，你会发现取不了值。因为BlogEngine里面的BusinessBase类实现了IDataErrorInfo接口，而IDataErrorInfo有一个索引器，<font style="color: #000000" color="#ff0000">也就是说BusinessBase有一个索引器，就因为有一个索引器，使Eval中不能用点来取值</font>(不知道是不是bug？)。</p>
<p>补充：上面说到的不是Bug，是因为BusinessBase实现了IDataErrorInfo接口，该接口有个索引器，导致ViewData.Eval()方法调用时搜索索引器的值时返回String.Empty而使ViewData.Eval()认为是找到值了，从而失效。</p>
<p><a style="background-color: rgb(255,255,247)" href="http://images.cnblogs.com/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC8ModelState_78BC/image_2.png" fade="233087532" jquery1223435239046="20"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="362" alt="image" src="http://images.cnblogs.com/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC8ModelState_78BC/image_thumb.png" width="428" border="0" /></a></p>
<p>我们可以将return string.Empty修改为return null，这样就可以了。</p>
<p>好，这一部分就先到这里吧。Enjoy！Post by <a href="http://www.cnblogs.com/QLeelulu/">Q.Lee.lulu</a>。
<p>本文示例Blog的代码：<a href="http://files.cnblogs.com/QLeelulu/4mvcBlog_5.rar">4mvcBlog_5.rar</a>
<p>---------------------------------------------------------------------
<p>更多内容，请关注<a href="http://blog.51mvc.com/">http://blog.51mvc.com/</a> 和 <a href="http://bbs.51mvc.com/">http://bbs.51mvc.com/</a></p>
<img src ="http://www.cnblogs.com/QLeelulu/aggbug/1303913.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42933/" target="_blank">[新闻]搞死开心网还是搞活他？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>ASP.NET MVC 入门4、Controller与Action</title><link>http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303672.html</link><dc:creator>Q.Lee.lulu</dc:creator><author>Q.Lee.lulu</author><pubDate>Fri, 03 Oct 2008 19:26:00 GMT</pubDate><guid>http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303672.html</guid><wfw:comment>http://www.cnblogs.com/QLeelulu/comments/1303672.html</wfw:comment><comments>http://www.cnblogs.com/QLeelulu/archive/2008/10/04/1303672.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/QLeelulu/comments/commentRss/1303672.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/QLeelulu/services/trackbacks/1303672.html</trackback:ping><description><![CDATA[<p>本系列文章基于ASP.NET MVC Preview5.</p> <p>Controller是MVC中比较重要的一部分。几乎所有的业务逻辑都是在这里进行处理的，并且从Model中取出数据。在ASP.NET MVC Preview5中，将原来的Controller类一分为二，分为了Controller类和ControllerBase类。Controller类继承自ControllerBase类，而ControllerBase实现是了IController接口。</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC4ControllerAction_303D/image_2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="232" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC4ControllerAction_303D/image_thumb.png" width="608" border="0"></a> </p> <p>ControllerBase实现了IController接口的Execute方法，在Route匹配到Controller之后，就会调用Execute方法来进入Controller的处理。这里还定义了一个抽象的方法ExecuteCore方法，该方法会在Execute方法的最后被调用。ControllerBase还定义了三个核心的属性。我们在后面会详细讨论TempData和ViewData。</p> <p>Controller类除了继承自ControllerBase类以外，还实现了好几个Filter接口，Filter我们在后面再详细讨论。</p> <div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000"> Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter{ } </span></div> <p><br>Controller类还定义很多有用的方法，我们新建的Controller都必须继承自这个Controller类。例如我们新建一个AdminController： </p> <div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000"> AdminController : Controller<br>{<br>}</span></div> <p>&nbsp; <p><strong>Action方法</strong></p> <p>下面谈一下在Controller中比较重要的Action方法。在ASP.NET MVC中URL都是映射到Controller中的某个Action中，然后由匹配的Action来处理我们的业务逻辑并返回view的。</p> <p>Controller中的public的方法都被当作是Action方法。Action方法通常返回一个ActionResult的结果。例如我们为前面的AdminController定义一个Setting的Action方法，用于设置Blog的一些基本参数：</p> <div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000"> AdminController : Controller<br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> ActionResult Setting()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000"> NotImplementedException();<br>&nbsp;&nbsp;&nbsp; }<br>} </span></div> <p>&nbsp; <p>默认情况下，Action方法的方法名就是这个Action的Action名(Action名指的是Route中匹配Action方法的URL的那部分。例如url：Home/Index，其中Index就是Action名)。这里为什么要提到这个Action名呢？应为Action名是可以定义的，使用ActionNameAttribute来定义。请看下面的示例：</p> <div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000"> ActionResult Setting()<br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000"> NotImplementedException();<br>} <br><br>[ActionName(</span><span style="color: #800000">"</span><span style="color: #800000">Setting</span><span style="color: #800000">"</span><span style="color: #000000">)]<br></span><span style="color: #0000ff">public</span><span style="color: #000000"> ActionResult SaveSetting()<br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000"> NotImplementedException();<br>} </span></div> <p>&nbsp; <p>这两个Action方法的Action名都为"Setting"，即对于url：Admin/Setting ,能同时匹配到这两个Action方法。如果一个URL同时匹配到两个Action方法的话，程序会抛出一个错误：</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC4ControllerAction_303D/image_4.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="233" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC4ControllerAction_303D/image_thumb_1.png" width="516" border="0"></a> </p> <p>如果我们希望这两个Action的Action名都为Setting，Setting()就用于显示一个表单页面给用户，而SaveSetting()就用于保存用户提交过来的表单数据，我们该怎么做呢？我们可以利用AcceptVerbsAttribute来设置，这个Attribute用来定义Action方法会匹配指定的HttpMethod。例如下面的代码：</p> <div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">[AcceptVerbs(</span><span style="color: #800000">"</span><span style="color: #800000">GET</span><span style="color: #800000">"</span><span style="color: #000000">)]<br></span><span style="color: #0000ff">public</span><span style="color: #000000"> ActionResult Setting()<br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000"> NotImplementedException();<br>} <br><br>[ActionName(</span><span style="color: #800000">"</span><span style="color: #800000">Setting</span><span style="color: #800000">"</span><span style="color: #000000">), AcceptVerbs(</span><span style="color: #800000">"</span><span style="color: #800000">POST</span><span style="color: #800000">"</span><span style="color: #000000">)]<br></span><span style="color: #0000ff">public</span><span style="color: #000000"> ActionResult SaveSetting()<br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000"> NotImplementedException();<br>}</span></div> <p>&nbsp; <p>这样，对于HttpMethod为"GET"的客户端请求，就会匹配到Setting()来显示一个表单给用户，如果用户POST回来的表单数据，则会匹配到SaveSetting()上面去，我们就可以处理用户POST过来的数据并保存到数据库。</p> <p>在这里AcceptVerbsAttribute是继承自ActionSelectionAttribute的，我们也可以继承自ActionSelectionAttribute来自定义自己想要实现的功能。这个我们后面会详细讲解。如果你比较心急，可以看下<a href="http://www.cnblogs.com/QLeelulu/archive/2008/08/30/1280264.html">Asp.net Mvc Preview 5 体验--实现ActionSelectionAttribute来判断是否为AJAX请求而选择不同的Action</a>这篇文章。</p> <p>如果你想将一个public的方法设置为不是Action方法，那么你就要为该public的方法添加NonAction的Attribute：</p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC4ControllerAction_303D/image_6.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="59" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC4ControllerAction_303D/image_thumb_2.png" width="243" border="0"></a> </p> <p><strong>Action方法的参数</strong></p> <p>例如我们要在AdminController中定义一个编辑日志的Action方法：</p> <div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000"> ActionResult EditPost(</span><span style="color: #0000ff">int</span><span style="color: #000000">?</span><span style="color: #000000"> id)<br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000"> NotImplementedException();<br>} </span></div> <p>&nbsp; <p>对于URL：Admin/EditPost/2 ，上面的参数会自动被赋值为2。ASP.NET MVC在匹配Route的时候会根据Route的设置自动为Action方法的参数赋值。所以前面的id参数会被自动赋值为2的前提是，在Route配置的时候，必须指定了id参数，例如：</p> <div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">routes.MapRoute(<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #800000">"</span><span style="color: #800000">Default</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000"> Route 的名称</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp; </span><span style="color: #800000">"</span><span style="color: #800000">{controller}/{action}/{<span style="color: #0000ff">id</span>}</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000"> 带有参数的URL</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">new</span><span style="color: #000000"> { controller </span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Home</span><span style="color: #800000">"</span><span style="color: #000000">, action </span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Index</span><span style="color: #800000">"</span><span style="color: #000000">, id </span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">""</span><span style="color: #000000"> }&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000"> 设置默认的参数</span><span style="color: #008000"><br></span><span style="color: #000000">); </span></div> <p>&nbsp; <p>如果我们将Route修改为： </p> <div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">routes.MapRoute(<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #800000">"</span><span style="color: #800000">Default</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000"> Route 的名称</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp; </span><span style="color: #800000">"</span><span style="color: #800000">{controller}/{action}/{<span style="color: #0000ff">para</span>}</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000"> 带有参数的URL</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">new</span><span style="color: #000000"> { controller </span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Home</span><span style="color: #800000">"</span><span style="color: #000000">, action </span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Index</span><span style="color: #800000">"</span><span style="color: #000000">, <span style="color: #0000ff">para</span>&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">""</span><span style="color: #000000"> }&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000"> 设置默认的参数</span><span style="color: #008000"><br></span><span style="color: #000000">); </span></div> <p>&nbsp; <p>则前面的Action方法的参数必须修改为public ActionResult EditPost(int? <font color="#ff0000">para</font>){ }，使Action方法的参数和Route中定义的参数名相同，ASP.NET MVC才能自动为Action方法的参数赋值。  <p><strong>ActionResult</strong> <p>Action方法返回ActionResult类型的结果。ASP.NET MVC为我们提供了几种ActionResult的实现，如下：</p> <form id="aspnetForm" name="aspnetForm" action="http://quickstarts.asp.net/MVCControllerActions.aspx" method="post"> <div id="main"> <div> <ul> <li> <p><span class="keyword"><font color="#008000">ViewResult</font></span>. 呈现视图页给客户端。由<span class="keyword">View</span> 方法返回.</p> <li> <p><span class="keyword"><font color="#008000">RedirectToRouteResult</font></span>. 重定向到另外一个Route。由<span class="keyword">RedirectToAction</span> 和<span class="keyword">RedirectToRoute</span> 方法返回.</p> <li> <p><span class="keyword"><font color="#008000">RedirectResult</font></span>. 重定向到另外一个URL。由 <span class="keyword">Redirect</span> 方法返回.</p> <li> <p><span class="keyword"><font color="#008000">ContentResult</font></span>. 返回普通的内容。例如一段字符串。由 <span class="keyword">Content</span> 方法返回.</p> <li> <p><span class="keyword"><font color="#008000">JsonResult</font></span>. 返回JSON结果。由 <span class="keyword">Json</span> 方法返回.</p> <li> <p><span class="keyword"><font color="#008000">EmptyResult</font></span>. 如果Action必须返回空值，可以返回这个结果。Controller中没有实现的方法，可以return new EmptyResult();.</p></li></ul></div> <p>当然我们也可以自定一个我们的ActionResult返回给客户端，例如一个RssResult。可以参考<a href="http://www.cnblogs.com/leven/archive/2008/05/29/1210215.html">Asp.Net MVC实践 - 自定义ActionResult实现Rss输出 (基于ASP.NET MVC Preview 3)</a>这篇文章。</p></div></form> <p>通常情况下，我们的Controller可能有一些相同的情况，例如我们在各个Controller中都有可能会在出错或者什么时候想要显示一条提示信息给用户，或者有一些共同的数据要呈现的。这时候，我们最好就定义一个我们自己的Controller的基类： </p> <div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000"> BaseController : Controller<br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> BaseController()<br>&nbsp;&nbsp;&nbsp; { <br><br>&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">protected</span><span style="color: #000000"> ActionResult ShowMsg(List</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000"> msgs)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000"> NotImplementedException();<br>&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> ActionResult Message()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000"> NotImplementedException();<br>&nbsp;&nbsp;&nbsp; }<br>} </span></div> <p>&nbsp; <p>然后，其他的Controller都继承自这个BaseController ：</p> <div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000"> AdminController : BaseController<br>{<br>&nbsp;&nbsp;&nbsp; [AcceptVerbs(</span><span style="color: #800000">"</span><span style="color: #800000">GET</span><span style="color: #800000">"</span><span style="color: #000000">)]<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> ActionResult Setting()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000"> NotImplementedException();<br>&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp; [ActionName(</span><span style="color: #800000">"</span><span style="color: #800000">Setting</span><span style="color: #800000">"</span><span style="color: #000000">), AcceptVerbs(</span><span style="color: #800000">"</span><span style="color: #800000">POST</span><span style="color: #800000">"</span><span style="color: #000000">)]<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> ActionResult SaveSetting()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000"> NotImplementedException();<br>&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> ActionResult EditPost(</span><span style="color: #0000ff">int</span><span style="color: #000000">?</span><span style="color: #000000"> id)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000"> NotImplementedException();<br>&nbsp;&nbsp;&nbsp; }<br>}</span></div>好，时间不早了，就先到这里吧。Enjoy！Post by <a href="http://www.cnblogs.com/QLeelulu/">Q.Lee.lulu</a>。  <p>---------------------------------------------------------------------  <p>更多内容，请关注<a href="http://blog.51mvc.com/">http://blog.51mvc.com/</a> 和 <a href="http://bbs.51mvc.com/">http://bbs.51mvc.com/</a></p><img src ="http://www.cnblogs.com/QLeelulu/aggbug/1303672.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42933/" target="_blank">[新闻]搞死开心网还是搞活他？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>ASP.NET MVC 入门3、Routing</title><link>http://www.cnblogs.com/QLeelulu/archive/2008/10/03/1303612.html</link><dc:creator>Q.Lee.lulu</dc:creator><author>Q.Lee.lulu</author><pubDate>Fri, 03 Oct 2008 15:04:00 GMT</pubDate><guid>http://www.cnblogs.com/QLeelulu/archive/2008/10/03/1303612.html</guid><wfw:comment>http://www.cnblogs.com/QLeelulu/comments/1303612.html</wfw:comment><comments>http://www.cnblogs.com/QLeelulu/archive/2008/10/03/1303612.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/QLeelulu/comments/commentRss/1303612.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/QLeelulu/services/trackbacks/1303612.html</trackback:ping><description><![CDATA[<p>本系列文章基于ASP.NET MVC Preview5.</p>
<p style="background: white"><span style="font-size: 10pt"><span style="font-family: 宋体">在一个</span><span style="font-family: trebuchet ms">route</span><span style="font-family: 宋体">中，通过在大括号中放一个占位符来定义</span><span style="font-family: trebuchet ms">( { and } )</span><span style="font-family: 宋体">。当解析</span><span style="font-family: trebuchet ms">URL</span><span style="font-family: 宋体">的时候，符号</span><span style="font-family: trebuchet ms">"/"</span><span style="font-family: 宋体">和</span><span style="font-family: trebuchet ms">"."</span><span style="font-family: 宋体">被作为一个定义符来解析，而定义符之间的值则匹配到占位符中。</span><span style="font-family: trebuchet ms">route</span><span style="font-family: 宋体">定义中不在大括号中的信息则作为常量值。</span><span style="font-family: trebuchet ms"><br />
</span><span style="font-family: 宋体">下面是一些示例</span><span style="font-family: trebuchet ms">URL</span><span style="font-family: 宋体">：</span></span><span style="font-size: 8pt; font-family: verdana"> </span></p>
<div>
<table style="border-collapse: collapse" border="0">
    <colgroup>
    <col style="width: 223px">
    <col style="width: 160px"></colgroup>
    <tbody valign="top">
        <tr style="background: #efeff7">
            <td style="border-right: #dadada 0.75pt solid; padding-right: 3px; border-top: #dadada 0.75pt solid; padding-left: 3px; padding-bottom: 3px; border-left: #dadada 0.75pt solid; padding-top: 3px; border-bottom: #dadada 0.75pt solid" colspan="2">
            <p><span style="font-size: 8pt; color: #000066; font-family: verdana"><strong>Valid route definitions</strong></span></p>
            </td>
            <td style="border-right: #dadada 0.75pt solid; padding-right: 3px; border-top: #dadada 0.75pt solid; padding-left: 3px; padding-bottom: 3px; border-left: medium none; padding-top: 3px; border-bottom: #dadada 0.75pt solid">
            <p><span style="font-size: 8pt; color: #000066; font-family: verdana"><strong>Examples of matching URL</strong></span></p>
            </td>
        </tr>
        <tr style="background: #f7f7ff">
            <td style="border-right: #dadada 0.75pt solid; padding-right: 3px; border-top: medium none; padding-left: 3px; padding-bottom: 3px; border-left: #dadada 0.75pt solid; padding-top: 3px; border-bottom: #dadada 0.75pt solid" colspan="2">
            <p><span style="font-size: 8pt; font-family: verdana">{controller}/{action}/{id}</span></p>
            </td>
            <td style="border-right: #dadada 0.75pt solid; padding-right: 3px; border-top: medium none; padding-left: 3px; padding-bottom: 3px; border-left: medium none; padding-top: 3px; border-bottom: #dadada 0.75pt solid">
            <p><span style="font-size: 8pt; font-family: verdana">/Products/show/beverages</span></p>
            </td>
        </tr>
        <tr style="background: #f7f7ff">
            <td style="border-right: #dadada 0.75pt solid; padding-right: 3px; border-top: medium none; padding-left: 3px; padding-bottom: 3px; border-left: #dadada 0.75pt solid; padding-top: 3px; border-bottom: #dadada 0.75pt solid" colspan="2">
            <p><span style="font-size: 8pt; font-family: verdana">{table}/Details.aspx</span></p>
            </td>
            <td style="border-right: #dadada 0.75pt solid; padding-right: 3px; border-top: medium none; padding-left: 3px; padding-bottom: 3px; border-left: medium none; padding-top: 3px; border-bottom: #dadada 0.75pt solid">
            <p><span style="font-size: 8pt; font-family: verdana">/Products/Details.aspx</span></p>
            </td>
        </tr>
        <tr style="background: #f7f7ff">
            <td style="border-right: #dadada 0.75pt solid; padding-right: 3px; border-top: medium none; padding-left: 3px; padding-bottom: 3px; border-left: #dadada 0.75pt solid; padding-top: 3px; border-bottom: #dadada 0.75pt solid" colspan="2">
            <p><span style="font-size: 8pt; font-family: verdana">blog/{action}/{entry}</span></p>
            </td>
            <td style="border-right: #dadada 0.75pt solid; padding-right: 3px; border-top: medium none; padding-left: 3px; padding-bottom: 3px; border-left: medium none; padding-top: 3px; border-bottom: #dadada 0.75pt solid">
            <p><span style="font-size: 8pt; font-family: verdana">/blog/show/123</span></p>
            </td>
        </tr>
        <tr style="background: #f7f7ff">
            <td style="border-right: #dadada 0.75pt solid; padding-right: 3px; border-top: medium none; padding-left: 3px; padding-bottom: 3px; border-left: #dadada 0.75pt solid; padding-top: 3px; border-bottom: #dadada 0.75pt solid" colspan="2">
            <p><span style="font-size: 8pt; font-family: verdana">{reporttype}/{year}/{month}/{day}</span></p>
            </td>
            <td style="border-right: #dadada 0.75pt solid; padding-right: 3px; border-top: medium none; padding-left: 3px; padding-bottom: 3px; border-left: medium none; padding-top: 3px; border-bottom: #dadada 0.75pt solid">
            <p><span style="font-size: 8pt; font-family: verdana">/sales/2008/1/5</span></p>
            </td>
        </tr>
    </table>
</div>
<p>&nbsp;<font style="font-size: 10pt" face="宋体" size="3">通常，我们在<span style="color: #76923c">Global.asax</span>文件中的<span style="color: #76923c">Application_Start</span>事件中添加routes，这确保routes在程序启动的时候就可用，而且也允许在你进行单元测试的时候直接调用该方法。如果你想在单元测试的时候直接调用它，注册该routes的方法必需是静态的同时有一个<span style="font-size: 10pt; color: #005500; font-family: courier new"><strong>RouteCollection</strong></span>参数。<br />
下面的示例是Global.asax中的代码，演示了添加一个包含两个URL参数<span style="font-size: 10pt; color: #005500; font-family: courier new">action</span><span style="font-size: 8pt; font-family: verdana"> </span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 8pt; font-family: verdana"> </span><span style="font-size: 10pt; color: #005500; font-family: courier new">categoryName</span>的Route对象：</font></p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;RegisterRoutes(RouteCollection&nbsp;routes)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">忽略对.axd文件的Route，也就是和WebForm一样直接去访问.axd文件</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;routes.IgnoreRoute(</span><span style="color: #800000">"</span><span style="color: #800000">{resource}.axd/{*pathInfo}</span><span style="color: #800000">"</span><span style="color: #000000">);&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;routes.MapRoute(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Category</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Route&nbsp;的名称</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Category/{action}/{categoryName}</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;带有参数的URL</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;{&nbsp;controller&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Category</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Index</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;categoryName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">4mvc</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;}&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置默认的参数</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;<br />
<br />
}&nbsp;<br />
<br />
</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Application_Start()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在程序启动的时候注册我们前面定义的Route规则</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;RegisterRoutes(RouteTable.Routes);<br />
}</span></div>
<p>更多文章请参考：</p>
<li><a href="http://www.cnblogs.com/chsword/archive/2008/08/27/System_Web_Routing_2.html">System.Web.Routing入门及进阶　下篇</a> By <a href="http://www.cnblogs.com/chsword/">重典</a></li>
<li><a href="http://www.cnblogs.com/chsword/archive/2008/08/27/System_Web_Routing_1.html">System.Web.Routing入门及进阶　上篇</a> By <a href="http://www.cnblogs.com/chsword/">重典</a></li>
<li><a href="http://www.cnblogs.com/QLeelulu/archive/2008/03/17/1109893.html">ASP.NET MVC URL Routing 学习</a> By <a href="http://www.cnblogs.com/QLeelulu/">Q.Lee.lulu</a></li>
<li><a href="http://quickstarts.asp.net/3-5-extensions/mvc/ASPNETRouting.aspx" target="_blank">ASP.NET Routing</a> (官方文档)
<div></div>
<p>在这里我不打算再详细去讲解。以下只是简单的说明一下。</p>
<p>忽略对某类URL的Routing：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">忽略对.axd文件的Route，也就是和WebForm一样直接去访问.axd文件</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;routes.IgnoreRoute(</span><span style="color: #800000">"</span><span style="color: #800000">{resource}.axd/{*pathInfo}</span><span style="color: #800000">"</span><span style="color: #000000">);&nbsp;</span></div>
<p>&nbsp;</p>
<p>添加约束条件，支持正则表达式。例如我们需要对id参数添加一个必须为数字的条件：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">routes.MapRoute(<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Default</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">{controller}/{action}/{id}</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;{&nbsp;controller&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Home</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Index</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">""</span><span style="color: #000000">&nbsp;},&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;{&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">@"</span><span style="color: #800000">[\d]*</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;}&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">id必须为参数</span><span style="color: #008000"><br />
</span><span style="color: #000000">);&nbsp;</span></div>
<p>&nbsp;
<p>使用星号(<font color="#ff0000">*</font>)匹配不确定个数的参数，这会匹配URL后面所有的剩余的参数。例如：
<p>query/{queryname}/<span style="color: #0000ff">{*queryvalues} </span>
<p>对于url：query/aspnetmvc/preview5/routing ,则queryvalues参数匹配的参数为 preview5/routing。
<p>url匹配Route是根据Route的定义顺序来自上而下匹配的。例如我们定义两个Route： </p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;RegisterRoutes(RouteCollection&nbsp;routes)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;routes.MapRoute(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Default</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Route&nbsp;的名称</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">{controller}/{action}/{id}</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;带有参数的URL</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;{&nbsp;controller&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Home</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Index</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">""</span><span style="color: #000000">&nbsp;}&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置默认的参数</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;routes.MapRoute(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Post</span><span style="color: #800000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Post/{id}</span><span style="color: #800000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;{&nbsp;controller&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Post</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Index</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">""</span><span style="color: #000000">&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;);<br />
}&nbsp;</span></div>
<p>不知你看出上面定义的两个Route有什么问题没有？我想你看出来了，URL永远都匹配不了第二个Route，也就是名为Post的Route，因为能匹配第二个Route的url一样也能匹配第一个Route,而url匹配Route是根据Route的定义顺序来自上而下匹配的，所以URL永远都匹配不了第二个Route。所以，在定义Route的时候，要将一些特别的Route放到前面。
<p>如果你要将ASP.NET MVC部署到IIS6下面，由于IIS6对于<a title="http://blog.51mvc.com/index" href="http://blog.51mvc.com/index">http://blog.51mvc.com/index</a>这类没有扩展名的URL是不会交由ASP.NET的aspnet_isapi.dll处理的，所以你的ASP.NET MVC程序部署到IIS6的时候可能会出现404错误。你可以为你的ASP.NET MVC站点添加一个通配符：
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC3Routing_131C2/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="466" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC3Routing_131C2/image_thumb.png" width="422" border="0" /></a>
<p>然后点击"通配符应用程序映射"下的"插入"按钮,在弹出的对话框中如下设置:
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC3Routing_131C2/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="153" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC3Routing_131C2/image_thumb_1.png" width="448" border="0" /></a>
<p>你如果担心添加通配符会给出现性能上的问题，那么你可以修改Route为带扩展名的，这个扩展名是完全由你自己定义的，例如我们使用4mvc来做url的扩展名： </p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">routes.MapRoute(<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Default</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Route&nbsp;的名称</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">{controller}<span style="color: #0000ff">.4mvc</span>/{action}/{id}</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;带有参数的URL</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;{&nbsp;controller&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Home</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Index</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">""</span><span style="color: #000000">&nbsp;}&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置默认的参数</span><span style="color: #008000"><br />
</span><span style="color: #000000">);&nbsp;</span></div>
<p>&nbsp;
<p>然后再在IIS6中添加这个扩展名的映射：
<p><a href="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC3Routing_131C2/image_6.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="435" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/QLeelulu/WindowsLiveWriter/ASP.NETMVC3Routing_131C2/image_thumb_2.png" width="558" border="0" /></a>
<p>然后我们访问的URL类似于：http://blog.51mvc.com/Home.4mvc/index
<p>群上有些朋友说希望教程能根据一个示例程序来写，那样更容易他们的学习。所以这里就写一个Blog的示例程序，为了方便，Model就直接使用<a href="http://www.dotnetblogengine.net/" target="_blank">Blogengine</a>的业务实体部分。在这里我们先定义这个blog的Route： </p>
<div class="cnblogs_code"><img id="Code_Closed_Image_232751" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_232751').style.display='none'; document.getElementById('Code_Open_Image_232751').style.display='inline'; document.getElementById('Code_Open_Text_232751').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_232751" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_232751').style.display='none'; getElementById('Code_Closed_Image_232751').style.display='inline'; getElementById('Code_Closed_Text_232751').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_232751">BlogRoute</span><span id="Code_Open_Text_232751" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;RegisterRoutes(RouteCollection&nbsp;routes)<br />
<img id="Codehighlighter1_58_843_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_58_843_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_58_843_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_58_843_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_58_843_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_58_843_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_58_843_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_58_843_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_58_843_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_58_843_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">忽略对.axd文件的Route，也就是和WebForm一样直接去访问.axd文件</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;routes.IgnoreRoute(</span><span style="color: #800000">"</span><span style="color: #800000">{resource}.axd/{*pathInfo}</span><span style="color: #800000">"</span><span style="color: #000000">);&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;routes.MapRoute(<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Admin</span><span style="color: #800000">"</span><span style="color: #000000">,<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Admin/{action}</span><span style="color: #800000">"</span><span style="color: #000000">,<br />
<img id="Codehighlighter1_239_281_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_239_281_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_239_281_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_239_281_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_239_281_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_239_281_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_239_281_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_239_281_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_239_281_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_239_281_Open_Text"><span style="color: #000000">{&nbsp;controller&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Admin</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Index</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;routes.MapRoute(<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">PostById</span><span style="color: #800000">"</span><span style="color: #000000">,<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Post/{id}</span><span style="color: #800000">"</span><span style="color: #000000">,<br />
<img id="Codehighlighter1_365_414_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_365_414_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_365_414_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_365_414_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_365_414_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_365_414_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_365_414_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_365_414_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_365_414_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_365_414_Open_Text"><span style="color: #000000">{&nbsp;controller&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Home</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Post</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">""</span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000">,<br />
<img id="Codehighlighter1_428_446_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_428_446_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_428_446_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_428_446_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_428_446_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_428_446_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_428_446_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_428_446_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_428_446_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_428_446_Open_Text"><span style="color: #000000">{&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">@"</span><span style="color: #800000">[\d]+</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;routes.MapRoute(<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">PostBySlug</span><span style="color: #800000">"</span><span style="color: #000000">,<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Post/{slug}</span><span style="color: #800000">"</span><span style="color: #000000">,<br />
<img id="Codehighlighter1_534_574_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_534_574_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_534_574_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_534_574_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_534_574_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_534_574_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_534_574_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_534_574_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_534_574_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_534_574_Open_Text"><span style="color: #000000">{&nbsp;controller&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Home</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Post</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;routes.MapRoute(<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Default</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Route&nbsp;的名称</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">{controller}/{action}/{id}</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;带有参数的URL</span><span style="color: #008000"><br />
<img id="Codehighlighter1_770_820_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_770_820_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_770_820_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_770_820_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_770_820_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_770_820_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_770_820_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_770_820_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_770_820_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_770_820_Open_Text"><span style="color: #000000">{&nbsp;controller&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Home</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Index</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">""</span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置默认的参数</span><span style="color: #008000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;</span></span></div>
<p>&nbsp;
<p>暂时就学到这里吧。后面我会给出本示例Blog程序的代码。Enjoy！Post by <a href="http://www.cnblogs.com/QLeelulu/">Q.Lee.lulu</a>。</p>
<p>---------------------------------------------------------------------
<p>更多内容，请关注<a href="http://blog.51mvc.com/">http://blog.51mvc.com/</a> 和 <a href="http://bbs.51mvc.com/">http://bbs.51mvc.com/</a></p>
</li>
 <img src ="http://www.cnblogs.com/QLeelulu/aggbug/1303612.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42932/" target="_blank">[新闻]网络书店“新”军</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>ASP.NET MVC 入门2、项目的目录结构与核心的DLL</title><link>http://www.cnblogs.com/QLeelulu/archive/2008/10/03/1303521.html</link><dc:creator>Q.Lee.lulu</dc:creator><author>Q.Lee.lulu</author><pubDate>Fri, 03 Oct 2008 08:23:00 GMT</pubDate><guid>http://www.cnblogs.com/QLeelulu/archive/2008/10/03/1303521.html</guid><wfw:comment>http://www.cnblogs.com/QLeelulu/comments/1303521.html</wfw:comment><comments>http://www.cnblogs.com/QLeelulu/archive/2008/10/03/1303521.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/QLeelulu/comments/commentRss/1303521.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/QLeelulu/services/trackbacks/1303521.html</trackback:ping><descripti