hac*_*sid 44 asp.net-mvc asp.net-mvc-2
给定一个HttpContext(或HttpContextBase),有没有办法获取Controller的实例?
Bil*_*ill 97
对于那些只是获取控制器名称而不是实际实例的人,如AuthorizeCore(httpContext)的自定义授权覆盖所需,这是干净的代码.
var request = httpContext.Request;
var currentUser = httpContext.User.Identity.Name;
string controller = request.RequestContext.RouteData.Values["controller"].ToString();
string action = request.RequestContext.RouteData.Values["action"].ToString();
Run Code Online (Sandbox Code Playgroud)
Geo*_*ker 32
在HttpContext将举行一个参考MvcHandler,这将举行一个参考RouteData,这将坚持正在由一个特定的路线调用什么控制器的引用.
注意: 这不会给你实际的控制器,只有特定路线要捕获的控制器.
GetController(HttpContextBase httpContext)
{
var routeData = ((MvcHandler)httpContext.Handler).RequestContext.RouteData;
var routeValues = routeData.Values;
var matchedRouteBase = routeData.Route;
var matchedRoute = matchedRouteBase as Route;
if (matchedRoute != null)
{
Route = matchedRoute.Url ?? string.Empty;
}
AssignRouteValues(httpContext, routeValues);
}
protected virtual VirtualPathData getVirtualPathData(HttpContextBase httpContext, RouteValueDictionary routeValues)
{
return RouteTable.Routes.GetVirtualPath(((MvcHandler)httpContext.Handler).RequestContext, routeValues);
}
private void AssignRouteValues(HttpContextBase httpContext, RouteValueDictionary routeValues)
{
var virtualPathData = getVirtualPathData(httpContext, routeValues);
if (virtualPathData != null)
{
var vpdRoute = virtualPathData.Route as Route;
if (vpdRoute != null)
{
RouteDefaults = vpdRoute.Defaults;
RouteConstraints = vpdRoute.Constraints;
RouteDataTokens = virtualPathData.DataTokens;
RouteValues = routeValues;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码可能看起来很熟悉,因为我已经从Phil Haack的路由调试器源代码中修改了它.
| 归档时间: |
|
| 查看次数: |
32139 次 |
| 最近记录: |