Jacky Chung

天之道,損有余而補不足。

首页 新随笔 联系 管理

   熟悉 Castle Monorail 的朋友应该对以下这段代码再熟悉不过了:

 

    public class HomeController : SmartDispatcherController
    {
        
public void Main()
        {
            PropertyBag[
"name"= "Jacky Chung";

            
if (this.IsGet)
            {
                
// Do something
                
// 
            }
            
else if (this.IsPost)
            {
                
// Do something
                
// 
            }
            
else
            {
                
// Do something
                
// 
            }
        }
    }

 

    其中,IsGet, IsPost属性用于判断当前HTTP的请求模式(GET或POST),它们都是继承自Controller基类的属性。

    但在 ASP.NET MVC 的Controller类上并没有提供这两个属性的实现。我们只能使用以下代码来判断HTTP的请求模式:

if (this.Request.HttpMethod == "GET")
{
    
// Do Something
    
// 
}
else if (this.Request.HttpMethod == "POST")
{
    
// Do Something
    
// 
}
else
{
    
// Do Something
    
// 
}

 

   这样的编码方式往往不是我们需要的。幸好,C#3.0 添加了Extension Method这个特性,我们可以利用该特性向

ASP.NET MVC 的 Controller类加入IsPost & IsGet 方法,以模仿Monorail的IsGet & IsPost属性。

    Extension Method 的代码如下:

    public static class MvcUtils
    {
        
public static bool IsPost(this Controller controller)
        {
            
if (controller.Request.HttpMethod == "POST")
                
return true;
            
return false;
        }

        
public static bool IsGet(this Controller controller)
        {
            
if (controller.Request.HttpMethod == "GET")
                
return true;
            
return false;
        }
    }

 

   Now,如果我们要使用该Extension Method, 只需要using该Method的命名空间即可,如:

using extension-method-namespace;

[HandleError]
public class HomeController : Controller
{
    
public ActionResult Index()
    {
        
if (this.IsGet())
        {
            ViewData[
"Message"= "Method: GET";
        }
        
else if (this.IsPost())
        {
            ViewData[
"Message"= "Method: POST";
        }
        
else
        {
            
// Do Something
            
// 
        }
        
        
return View();
     }
}

 

   注意:上述代码中的this.IsGet() 方法,它并不是HomeControl类的成员方法,也不是继承于其基类的方法,而是

MvcUtils静态类的IsGet()方法。关于更多Extension Method的知识,可浏览MSDN获取。

 

 

posted on 2009-04-07 12:01  Jacky Chung  阅读(488)  评论(0编辑  收藏  举报