有两件事我不能在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行)下覆盖数据?
如果我不想知道它,那么我不会问。有时候你可以通过了解细节来了解更多,你知道的。 – user107986
这篇文章中使用的方法并不是一个很好的解决方案。它将控制器内部的路由带入它不属于的地方。一个更好的方法是继承Route类,重写GetRouteData,并且无论如何都可以返回相同的controller和action。(如果需要,可以选择存储原始值)。然后使用自定义的'Route'类来注册所有的路由。 – NightOwl888