private static RouteValueDictionary GetRouteValuesFromExpression <TController>(Expression <Action <TController> > action) where TController : Controller { if (action == null) { throw new ArgumentNullException("action"); } MethodCallExpression call = action.Body as MethodCallExpression; string controllerName = typeof(TController).Name; controllerName = controllerName.Substring(0, controllerName.Length - "Controller".Length); string actionName = GetTargetActionName(call.Method); var rvd = new RouteValueDictionary(); rvd.Add("Controller", controllerName); rvd.Add("Action", actionName); ActionLinkAreaAttribute areaAttr = typeof(TController).GetCustomAttributes(typeof(ActionLinkAreaAttribute), true /* inherit */).FirstOrDefault() as ActionLinkAreaAttribute; if (areaAttr != null) { string areaName = areaAttr.Area; rvd.Add("Area", areaName); } AddParameterValuesFromExpressionToDictionary(rvd, call); return(rvd); }
public static RouteValueDictionary GetRouteValuesFromExpression <TController>(Expression <Action <TController> > action) where TController : Controller { if (action == null) { throw new ArgumentNullException("action"); } MethodCallExpression call = action.Body as MethodCallExpression; if (call == null) { throw new ArgumentException(MvcResources.ExpressionHelper_MustBeMethodCall, "action"); } string controllerName = typeof(TController).Name; if (!controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) { throw new ArgumentException(MvcResources.ExpressionHelper_TargetMustEndInController, "action"); } controllerName = controllerName.Substring(0, controllerName.Length - "Controller".Length); if (controllerName.Length == 0) { throw new ArgumentException(MvcResources.ExpressionHelper_CannotRouteToController, "action"); } // TODO: How do we know that this method is even web callable? // For now, we just let the call itself throw an exception. string actionName = GetTargetActionName(call.Method); var rvd = new RouteValueDictionary(); rvd.Add("Controller", controllerName); rvd.Add("Action", actionName); ActionLinkAreaAttribute areaAttr = typeof(TController).GetCustomAttributes(typeof(ActionLinkAreaAttribute), true /* inherit */).FirstOrDefault() as ActionLinkAreaAttribute; if (areaAttr != null) { string areaName = areaAttr.Area; rvd.Add("Area", areaName); } AddParameterValuesFromExpressionToDictionary(rvd, call); return(rvd); }
private static void AddControllerInfoToDictionary(RouteValueDictionary rvd, MethodCallExpression call, string controllerName, Type controllerType) { // TODO: How do we know that this method is even web callable? // For now, we just let the call itself throw an exception. string actionName = GetTargetActionName(call.Method); rvd.Add("Controller", controllerName); rvd.Add("Action", actionName); ActionLinkAreaAttribute areaAttr = controllerType.GetCustomAttributes(typeof(ActionLinkAreaAttribute), true /* inherit */).FirstOrDefault() as ActionLinkAreaAttribute; if (areaAttr != null) { string areaName = areaAttr.Area; rvd.Add("Area", areaName); } }