2015-09-07 15 views
1

有兩件事我不能在this article中掌握。它解釋了使用ASP.NET MVC的方式,而不需要爲每個視圖分別控制器或操作。無需爲每個視圖解決方案單獨控制器或操作 - 瞭解代碼

1)DispatchRequest方法:

private void DispatchRequest(IControllerFactory controllerFactory, string controller, string action) 
    { 
     var route = GetRoute(controller, action); 
     _requestContext.RouteData.Values["x-action"] = action; 
     _requestContext.RouteData.Values["x-controller"] = controller; 

     if (route != null) 
     { 
      _requestContext.RouteData.Values["controller"] = route.Controller; 
      _requestContext.RouteData.Values["action"] = route.Action; 

      if (route.Area != string.Empty) 
      { 
       _requestContext.RouteData.DataTokens["area"] = route.Area; 
      } 

      controller = route.Controller; 

的動作和控制器字符串 「X-動作」 和 「x-控制器」 鍵下儲存。控制器和動作下面幾行存儲在「控制器」和「動作」鍵下。

對(控制器和動作)都是字符串,不是這些對相同嗎?它看起來像我一樣。爲什麼不必要地複製數據?

2)在所述控制器,ControllerLessController

public virtual ActionResult Index() 
    { 
     var action = RouteData.Values["x-action"].ToString(); 
     var controller = RouteData.Values["x-controller"].ToString(); 
     RouteData.Values["action"] = action; 
     RouteData.Values["controller"] = controller; 
     if (RouteData.Values["area"] != null) 
     { 
      RouteData.DataTokens["area"] = RouteData.Values["area"].ToString(); 
     } 

     return View(action); 
    } 
} 

通知的前兩行中的身體。爲什麼在字符串對象上調用toString?此外,爲什麼有人決定將它們存儲在動作和控制器變量中,並在「動作」和「控制器」鍵(第3,4行)下覆蓋數據?

+1

如果我不想知道它,那麼我不會問。有時候你可以通過了解細節來了解更多,你知道的。 – user107986

+0

這篇文章中使用的方法並不是一個很好的解決方案。它將控制器內部的路由帶入它不屬於的地方。一個更好的方法是繼承Route類,重寫GetRouteData,並且無論如何都可以返回相同的controller和action。(如果需要,可以選擇存儲原始值)。然後使用自定義的'Route'類來註冊所有的路由。 – NightOwl888

回答

1
  1. 兩對(控制器和動作)是字符串,不這些對相同?它看起來像我一樣。爲什麼不必要地複製數據 ?

號的意圖是原始的請求值存儲在「X-行動」,「X-控制器」,然後覆蓋「行動」,「控制器」在必要時同時仍然具有訪問原始值在處理的後期階段。 「x-action」,「x-controller」僅僅被用作臨時變量。它們被存儲在RouteData中,因爲一旦調度方法完成,任何本地變量都將超出範圍。

  1. 注意正文中的前兩行。爲什麼在字符串對象上調用toString?

RouteData.Values經由字符串索引因此ToString返回一個對象。即 RouteData.Values["MyValue"]返回一個對象而不是一個字符串。

而且,爲什麼有人決定將它們存儲在動作和控制器 變量和覆蓋「行動」和「控制」按鍵 (線3,4)下的數據?

這可以追溯到在1到TempData想法的行動請求到來時,通常在MVC中,將轉化爲一個看法,但這裏在這個無控制器的例子無控制器的操作需要映射控制器到無控制器處理程序。

所以在DispatchRequest這些被覆蓋指向無控制器處理程序class ControllerLessController : Controller

注意這是在控制器選擇之前發生的

然後MVC以正常的方式處理請求,但由於轉換在Dispatch MVC不尋找最初請求的控制器(因爲沒有一個),而是使用注入的無控制器控制器:

_requestContext.RouteData.Values["action"] = _configuration.DefaultAction; 
controller = _configuration.DefaultController; 

然後正常的請求處理進行並着陸在無控制器控制器內。在那一點上,我們需要重新找回原始請求的視圖。

public virtual ActionResult Index() 
    { 
     var action = RouteData.Values["x-action"].ToString(); 
     var controller = RouteData.Values["x-controller"].ToString(); 
     RouteData.Values["action"] = action; 
     RouteData.Values["controller"] = controller; 
     if (RouteData.Values["area"] != null) 
     { 
      RouteData.DataTokens["area"] = RouteData.Values["area"].ToString(); 
     } 

     return View(action); 
    } 

此信息被存儲在 「X-行動」 路線值,以便他們拉了這一點,並返回一個視圖的原始請求:

return View(action);

其中

var action = RouteData.Values["x-action"].ToString();

基本上你只是有一個重定向/攔截層。我們將沒有控制器的所有操作重新指向某個處理程序,在這種情況下爲ControllerLessController。在我們這樣做之前,我們需要將原始請求參數存儲在「x-action」變量中。然後,在ControllerLessController處理程序中,我們將這些原始值取出,以便我們可以生成原始控制器請求的視圖。

+0

我想知道這個人如何設法寫它,如果例如RouteElement或RouteConfiguration類沒有記錄在msdn上。這些類的來源是否可用? – user107986

+0

下載文章代碼並查看。 '使用Anterec.ControllerLess.Configuration;'建議他們有一些自定義的dll。 – rism

相關問題