<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
        My Github

      自己動手寫一個簡單的MVC框架(第一版)

      一、MVC概念回顧

      asp.net mvc

        路由(Route)、控制器(Controller)、行為(Action)、模型(Model)、視圖(View)

      用一句簡單地話來描述以上關(guān)鍵點:

        路由(Route)就相當(dāng)于一個公司的前臺小姐,她負責(zé)帶你(請求)找到跟你面試的面試官(控制器Controller),面試官可能會面試不同的職位(Action),你(請求)也會拿到不同的結(jié)果(ActionResult);

      二、開始DEMO:單一處理程序入口

      2.1 創(chuàng)建一個空白Web程序,移除所有默認引用

        無論是ASP.NET WebForms還是ASP.NET MVC,他們都只是一個框架,是建立在System.Web之上的框架。為了保證程序的純凈,我們可以將所有默認的引用都移除。當(dāng)然,我們還是得保留幾個必要的dll引用:

      注意:這里我們并沒有引入System.Web.Mvc.dll,因為我們要實現(xiàn)的就是一個簡單的MVC機制。

      2.2 模擬ASP.NET MVC,創(chuàng)建幾個MVC文件夾

        按照ASP.NET MVC的慣例添加Controllers、Models和Views文件夾(不是必須的):

      2.3 新建一個Controller

        我們首先在Controllers文件夾下新建一個接口,取名為IController,它約定了所有Controller都必須要實現(xiàn)的方法:Execute

          public interface IController
          {
              void Execute(HttpContext context);
          }

        IController接口只定義了一個方法聲明,它接收一個HttpContext的上下文對象。

        有了接口,我們就可以實現(xiàn)具體的Controller了,這里我們實現(xiàn)了兩個Controller:HomeController和ProductController。

        (1)HomeController

          public class HomeController : IController
          {
              private HttpContext currentContext;
      
              // action 1 : Index
              public void Index()
              {
                  currentContext.Response.Write("Home Index Success!");
              }
      
              // action 2 : Add
              public void Add()
              {
                  currentContext.Response.Write("Home Add Success!");
              }
      
              public void Execute(HttpContext context)
              {
                  currentContext = context;
                  // 默認Action名稱
                  string actionName = "index";
                  // 獲取Action名稱
                  if (!string.IsNullOrEmpty(context.Request["action"]))
                  {
                      actionName = context.Request["action"];
                  }
      
                  switch (actionName.ToLower())
                  {
                      case "index":
                          this.Index();
                          break;
                      case "add":
                          this.Add();
                          break;
                      default:
                          this.Index();
                          break;
                  }
              }
          }
      View Code

        (2)ProductController

          public class ProductController : IController
          {
              private HttpContext currentContext;
      
              // action 1 : Index
              public void Index()
              {
                  currentContext.Response.Write("Product Index Success!");
              }
      
              // action 2 : Add
              public void Add()
              {
                  currentContext.Response.Write("Product Add Success!");
              }
      
              public void Execute(HttpContext context)
              {
                  currentContext = context;
                  // 默認Action名稱
                  string actionName = "index";
                  // 獲取Action名稱
                  if (!string.IsNullOrEmpty(context.Request["action"]))
                  {
                      actionName = context.Request["action"];
                  }
      
                  switch (actionName.ToLower())
                  {
                      case "index":
                          this.Index();
                          break;
                      case "add":
                          this.Add();
                          break;
                      default:
                          this.Index();
                          break;
                  }
              }
          }
      View Code

      2.4 新建一個ashx(一般處理程序),作為處理程序的入口

        有了Controller之后,需要借助一個入口來指引請求到達指定Controller,所以這里我們實現(xiàn)一個最簡單的一般處理程序,它將url中的參數(shù)進行解析并實例化指定的Controller進行后續(xù)請求處理:

          /// <summary>
          /// 模擬MVC程序的單一入口
          /// </summary>
          public class Index : IHttpHandler
          {
              public void ProcessRequest(HttpContext context)
              {
                  // 獲取Controller名稱
                  var controllerName = context.Request.QueryString["c"];
                  // 聲明IControoler接口-根據(jù)Controller Name找到對應(yīng)的Controller
                  IController controller = null;
      
                  if (string.IsNullOrEmpty(controllerName))
                  {
                      controllerName = "home";
                  }
      
                  switch (controllerName.ToLower())
                  {
                      case "home":
                          controller = new HomeController();
                          break;
                      case "product":
                          controller = new ProductController();
                          break;
                      default:
                          controller = new HomeController();
                          break;
                  }
      
                  controller.Execute(context);
              }
      
              public bool IsReusable
              {
                  get
                  {
                      return false;
                  }
              }
          }
      View Code

        該一般處理程序接收http請求的兩個參數(shù)controller和action,并通過controller的參數(shù)名稱生成對應(yīng)的Controller實例對象,將HttpContext對象作為參數(shù)傳遞給對應(yīng)的Controller對象進行后續(xù)處理。

      2.5 新建一個Global(全局處理程序),作為路由映射的入口

        在Global.asax中有一個Application_BeginRequest的事件,它發(fā)生在每個Request開始處理之前,因此在這里我們可以進行一些類似于URL重寫的工作。解析URL當(dāng)然也在這里進行,我們要做的就是將用戶輸入的類似于MVC形式的URL:http://www.xxx.com/home/index 進行正確的解析,將該請求交由HomeController進行處理。

          public class Global : System.Web.HttpApplication
          {
              protected void Application_BeginRequest(object sender, EventArgs e)
              {
                  #region 方式一:偽靜態(tài)方式實現(xiàn)路由映射服務(wù)
                  // 獲得當(dāng)前請求的URL地址
                  var executePath = Request.AppRelativeCurrentExecutionFilePath;
                  // 獲得當(dāng)前請求的參數(shù)數(shù)組
                  var paraArray = executePath.Substring(2).Split('/');
                  // 如果沒有參數(shù)則執(zhí)行默認配置
                  if (string.IsNullOrEmpty(executePath) || executePath.Equals("~/") ||
                      paraArray.Length == 0)
                  {
                      return;
                  }
      
                  string controllerName = "home";
                  if (paraArray.Length > 0)
                  {
                      controllerName = paraArray[0];
                  }
                  string actionName = "index";
                  if (paraArray.Length > 1)
                  {
                      actionName = paraArray[1];
                  }
      
                  // 入口一:單一入口 Index.ashx
                  Context.RewritePath(string.Format("~/Index.ashx?controller={0}&action={1}", controllerName, actionName));
                  // 入口二:指定MvcHandler進行后續(xù)處理
                  //Context.RemapHandler(new MvcHandler());
                  #endregion
              }
          }
      View Code

        這里我們直接在代碼中hardcode了一個默認的controller和action名稱,分別是home和index。

        可以看出,最后我們實際上做的就是解析URL,并通過重定向到Index.ashx進行所謂的Route路由工作。

      2.6 運行吧偽MVC

        (1)默認路由

        (2)/home/add

        (3)/product/index

      三、改造DEMO:借助反射讓多態(tài)發(fā)光

      3.1 在Global文件中模擬路由規(guī)則表

        想想我們在ASP.NET MVC項目中是不是首先向程序注冊一些指定的路由規(guī)則,因此這里我們也在Global.asax中模擬一個路由規(guī)則表:

        (1)增加一個靜態(tài)的路由規(guī)則集合

          // 定義路由規(guī)則
          private static IList<string> Routes;

        (2)在Application_Start事件中注冊路由規(guī)則

          protected void Application_Start(object sender, EventArgs e)
          {
              Routes = new
      
      
      
      
      主站蜘蛛池模板:
      亚洲深深色噜噜狠狠网站|
      四虎永久精品免费视频|
      亚洲免费最大黄页网站|
      亚洲AV片一区二区三区|
      久久人搡人人玩人妻精品|
      国产精品伦人视频免费看|
      国产精品久久毛片|
      蜜桃视频网站|
      久久精品免视看国产成人|
      彭水|
      国产成人精品久久一区二区|
      日本高清视频在线www色|
      国产真正老熟女无套内射|
      高清中文字幕国产精品|
      久久月本道色综合久久|
      中文字幕无码视频手机免费看|
      99热这里只有成人精品国产
      |
      国产成人精品中文字幕|
      国产免费午夜福利蜜芽无码|
      国产愉拍91九色国产愉拍|
      人妻少妇精品无码专区|
      欧美肥妇毛多水多bbxx|
      国内自拍偷拍福利视频看看|
      汪清县|
      亚洲人成电影在线天堂色|
      欧美z0zo人禽交另类视频|
      欧美国产日韩在线三区|
      无线乱码一二三区免费看|
      无码一区中文字幕|
      亚洲国产一区二区三区|
      大陆熟妇丰满多毛xxxx|
      黑森林福利视频导航|
      激情国产一区二区三区四区|
      一个人看的www免费高清视频|
      色五月丁香五月综合五月|
      久久久精品94久久精品|
      国产精一区二区黑人巨大|
      国产尤物精品自在拍视频首页
      |
      色噜噜亚洲男人的天堂|
      福利一区二区在线观看|
      久久亚洲精品亚洲人av|