2015-09-07 13 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

相关问题