[譯]Asp.net MVC 之 Contorllers(一)


Asp.net MVC contorllers

    在Ajax全面開花的時代,ASP.NET Web Forms 開始慢慢變得落后。有人說,Ajax已經給了Asp.net致命一擊。Ajax使越來越多的控制在Html和客戶端代碼完成。隨着時間的推移,導致了架構的變化,也使ASP.NET Web Forms有點不能適應當今潮流。

 

    基於當前的ASP.NET運行時環境和MVC模式,誕生了一個新的架構——ASP.NET MVC,這種組合的Web開發模式順應了當今的開發的趨勢。

 

    在ASP.NET MVC中,每一個請求最終就是執行一個特殊類中的Action方法。Action的執行結果被傳遞給帶有視圖模版的視圖子系統中。瀏覽器最終的響應結果就是由Action的執行結果和這個模版創建的。

 

    與Web Forms不同,ASP.NET MVC是由各個層的代碼連接在一起的,這些層次之間既不是相互交叉,也不是單一一坨的模塊。正因如此,根據自定義組件能很輕松的替換其中任何一層,這樣就提高了解決方案的可維護性和穩定性。使用ASP.NET MVC,不僅有標簽的完全控制權,還可以使用樣式和喜歡的js框架。

 

    盡管你想堅持使用Web Froms,但是對於當今的Web開發來說,ASP.NET MVC 確實是一個更好的選擇。我們不需要花費太多的時間去學習,但是我們必須知道怎么運用以及MVC工作原理。如果這樣做了,那么我們投入將會快速的帶給我們應有的回報。

 

    注:本系列是基於ASP.NET MVC 5。該版本是向前兼容的,也就是說,一台電腦中可以同時安裝新老版本,新版本運行不會影響現存MVC版本代碼。

 

路由請求

    最初,ASP.NET平台的開發主要是圍繞着服務器端物理頁面請求的思想。在ASP.NET應用程序中使用的大多數的URL是由兩部分組成:包含邏輯的物理網頁的路徑,和一些填充在查詢字符串中的作為參數的數據。這種方式已經使用了有些年了,現在仍在被使用。ASP.NET運行時環境沒有限制我們只能調用特定位置或者文件的資源。通過寫一個專門的HTTP處理程序,並綁定到URL,我們就可以使用ASP.NET響應一個非依賴於物理文件的請求執行代碼。這只是ASP.NET MVC不同於ASP.NET Web Forms眾多不同中的一個方面。接下來我們看看如何通過使用一個HTTP處理程序來模擬ASP.NET MVC行為。

    注:在軟件中,專業術語URI(Uniform Resource Identifier)是用於通過位置或名稱來引用的資源。當URI通過位置來標識資源時,就是URL(Uniform Resource Locator)。當URI通過名稱標識資源時,就變成了URN(Uniform Resource Name)。在這方面,ASP.NET MVC是設計來處理更通用的URI,而ASP.NET Web Forms被設計來處理位置識別物理資源

模擬ASP.NET運行時

    我們構建一個簡單的ASP.NET Web Forms應用程序,使用HTTP處理程序搞清楚ASP.NET MVC應用程序的內部機制。我們從最基本的ASP.NET Web Forms應用程序開始。

 

定義辨認URLs的語法

    請求的URLs不需要匹配服務器端的物理文件。第一步列出應用程序有意義的URLs。為了避免太特殊,我們假設支持幾個固定的URLs,把他們映射到一個HTTP處理程序模塊。下面的代碼片段顯示了請求中默認Web.config的變化

  <system.web>
    <httpHandlers>
      <add verb="*" path="home/test/*" type="MvcEmule.Components.MvcEmuleHandler"/>
    </httpHandlers>
  </system.web>
MvcEmuleHandler

    只要應用程序收到一個與配置中匹配的URL請求,就會轉到相應的處理程序。

定義HTTP處理程序行為

    在ASP.NET中,HTTP處理程序是一個實現了IHttpHandler接口的組件。非常簡單,只有兩個成員,代碼如下:

    public class MvcEmuleHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            // 業務邏輯
        }

        public Boolean IsReusable
        {
            get { return false; }
        }
    }
public class MvcEmuleHandler : IHttpHandler

    大多數時候,HTTP處理程序是根據輸入數據的查詢字符串傳遞(query string)相關的硬編碼行為。然而,他不能阻止我們使用請求處理程序最為抽象工廠,增加一個或多個簡介層。事實上,我們可以使用請求處理程序中的請求信息,來確定外部的實際服務請求。按照這種方式,一個簡單的HTTP請求程序可以服務於大量的請求,只要調用一些更加專門的組件。

HTTP 處理程序可以解析出 URL中的標記(Controller、action、param),並使用該信息來標識類和調用的方法。下面是它如何工作的示例:

public void ProcessRequest(HttpContext context)
        {
            // 轉化 URL 並獲取 controller, action, 和參數
            var segments = context.Request.Url.Segments;
            var controller = segments[1].TrimEnd('/');
            var action = segments[2].TrimEnd('/');
            var param1 = segments[3].TrimEnd('/');

            // 使用前綴和命名空間組裝Controller類名
            var fullName = String.Format("{0}.{1}Controller",
            this.GetType().Namespace, controller);
            var controllerType = Type.GetType(fullName, true, true);

            // 實例化controller
            var instance = Activator.CreateInstance(controllerType);

            // 調用 controller 實例的 action 方法 
            var methodInfo = controllerType.GetMethod(action,
            BindingFlags.Instance |
            BindingFlags.IgnoreCase |
            BindingFlags.Public);
            var result = String.Empty;
            if (methodInfo.GetParameters().Length == 0)
            {
                result = methodInfo.Invoke(instance, null) as String;
            }
            else
            {
                result = methodInfo.Invoke(instance, new Object[] { param1 }) as String;
            }

            // 返回結果
            context.Response.Write(result);
        }
public void ProcessRequest(HttpContext context)

    我們假設上面的代碼中,服務器名稱后面的第一個標記,唯一標識了服務請求的組件(類)。第二個標記涉及這個組件(類)中需要調用的方法名最后,第三個標記標識傳遞的參數

請求HTTP處理程序

    在瀏覽器中輸入一個URL http://localhost:9086/home/test/*,他的結果就是,“home”標識了類名,“test”標識方法名,無論結尾是什么,都作為參數。類型進一步制定,擴展為包含命名空間和后綴。根據實例,,最終類名是MvcEmule.Components.HomeController。預計這個類對於應用程序是可用的,也暴露一個名為Test的方法。看下結果:

    public class HomeController
    {
        public String Test(Object param1)
        {
            var message = "<html><h1>Got it! You passed ‘{0}’</h1></html>";
            return String.Format(message, param1);
        }
    }
public String Test(Object param1)

http://www.cnblogs.com/BoyceYang/

    這個簡單的實例說明了如何使用ASP.NET MVC最基本的機制。控制器(Controller)是一個為請求提供服務的專門的組件。控制器(Controller)是一個只有方法沒有狀態的類。一個獨特的系統級HTTP處理程序負責將發來的請求匹配到一個特定的控制器類,這樣一個類的實例將執行一個給定的操作方法,並產生一個響應。

    那么Url 的方案是怎樣呢?在此示例中,我們只是使用硬編碼的 URL。在 ASP.NET MVC 中,有一種非常靈活的語法,可以使用表示應用程序能夠識別的這些 Url。此外,一個新的系統組件在運行時管道中截取的請求、 處理 URL,並觸發的 ASP.NET MVC HTTP 處理程序。此組件是 URL 路由的 HTTP 模塊。關於URL路由模塊,下次再譯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM