【发布时间】:2015-09-07 23:03:31
【问题描述】:
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-action”和“x-controller”键下。控制器和动作下面的几行存储在“控制器”和“动作”键下。
两个对(控制器和动作)都是字符串,这些对不一样吗?在我看来,他们就是这样。为什么要不必要地复制数据?
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 行)?
【问题讨论】:
-
如果我不想知道,那我也不会问。有时你可以通过了解细节来了解更多信息,你知道的。
-
对于它的价值,文章中使用的方法不是一个很好的解决方案。它将路由带到控制器内部不属于它的地方。更好的方法是继承
Route类,覆盖GetRouteData并始终返回相同的controller和action(如果需要,还可以选择存储原始值)。然后使用自定义的Route类来注册所有的路由。
标签: c# asp.net-mvc httphandler