Skip to content

Commit

Permalink
Add additional requestContext and requestContext.RouteData null c…
Browse files Browse the repository at this point in the history
…hecks

- #6
  • Loading branch information
dougbu committed Oct 17, 2017
1 parent 2667ae2 commit 3482799
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions src/System.Web.Mvc/DefaultControllerFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,8 @@ public virtual IController CreateController(RequestContext requestContext, strin
throw new ArgumentNullException("requestContext");
}

if (String.IsNullOrEmpty(controllerName) && !requestContext.RouteData.HasDirectRouteMatch())
if (String.IsNullOrEmpty(controllerName) &&
(requestContext.RouteData == null || !requestContext.RouteData.HasDirectRouteMatch()))
{
throw new ArgumentException(MvcResources.Common_NullOrEmpty, "controllerName");
}
Expand All @@ -153,6 +154,10 @@ public virtual IController CreateController(RequestContext requestContext, strin

protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (requestContext == null)
{
throw new ArgumentNullException("requestContext");
}
if (controllerType == null)
{
throw new HttpException(404,
Expand All @@ -170,6 +175,7 @@ protected internal virtual IController GetControllerInstance(RequestContext requ
controllerType),
"controllerType");
}

return ControllerActivator.Create(requestContext, controllerType);
}

Expand Down Expand Up @@ -214,7 +220,7 @@ protected internal virtual Type GetControllerType(RequestContext requestContext,
// first search in the current route's namespace collection
object routeNamespacesObj;
Type match;
if (routeData.DataTokens.TryGetValue(RouteDataTokenKeys.Namespaces, out routeNamespacesObj))
if (routeData != null && routeData.DataTokens.TryGetValue(RouteDataTokenKeys.Namespaces, out routeNamespacesObj))
{
IEnumerable<string> routeNamespaces = routeNamespacesObj as IEnumerable<string>;
if (routeNamespaces != null && routeNamespaces.Any())
Expand All @@ -232,18 +238,19 @@ protected internal virtual Type GetControllerType(RequestContext requestContext,
}

// then search in the application's default namespace collection
RouteBase route = routeData == null ? null : routeData.Route;
if (ControllerBuilder.DefaultNamespaces.Count > 0)
{
HashSet<string> namespaceDefaults = new HashSet<string>(ControllerBuilder.DefaultNamespaces, StringComparer.OrdinalIgnoreCase);
match = GetControllerTypeWithinNamespaces(routeData.Route, controllerName, namespaceDefaults);
match = GetControllerTypeWithinNamespaces(route, controllerName, namespaceDefaults);
if (match != null)
{
return match;
}
}

// if all else fails, search every namespace
return GetControllerTypeWithinNamespaces(routeData.Route, controllerName, null /* namespaces */);
return GetControllerTypeWithinNamespaces(route, controllerName, null /* namespaces */);
}

private static Type GetControllerTypeFromDirectRoute(RouteData routeData)
Expand Down

0 comments on commit 3482799

Please sign in to comment.