public static NamedRoute ToDefaultAction <T>(this NamedRoute route, Expression <Func <T, ActionResult> > action) where T : IController { var body = action.Body as MethodCallExpression; if (body == null) { throw new ArgumentException("Expression must be a method call"); } if (body.Object != action.Parameters[0]) { throw new ArgumentException("Method call must target lambda argument"); } string actionName = body.Method.Name; // check for ActionName attribute var attributes = body.Method.GetCustomAttributes(typeof(ActionNameAttribute), false); if (attributes.Length > 0) { var actionNameAttr = (ActionNameAttribute)attributes[0]; actionName = actionNameAttr.Name; } string controllerName = typeof(T).Name; if (controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) { controllerName = controllerName.Remove(controllerName.Length - 10, 10); } ; route.Defaults = LinkBuilder.BuildParameterValuesFromExpression(body) ?? new RouteValueDictionary(); foreach (var pair in route.Defaults.Where(x => x.Value == null).ToList()) { route.Defaults.Remove(pair.Key); } route.Defaults.Add("controller", controllerName); route.Defaults.Add("action", actionName); route.Url = CreateUrl(actionName, controllerName); route.Name = "Navigation-" + controllerName + "-" + actionName; if (route.DataTokens == null) { route.DataTokens = new RouteValueDictionary(); } route.DataTokens.Add("Namespaces", new string[] { typeof(T).Namespace }); return(route); }
private static RouteValueDictionary GetRouteValuesFromExpression(MethodCallExpression body, string areaName, string controllerName, string actionName) { var routeValues = LinkBuilder.BuildParameterValuesFromExpression(body) ?? new RouteValueDictionary(); foreach (var pair in routeValues.Where(x => x.Value == null).ToList()) { routeValues.Remove(pair.Key); } routeValues.Add("controller", controllerName); routeValues.Add("action", actionName); return(routeValues); }
private static RedirectToRouteResult RedirectToActionInternal <T>(Expression <Action <T> > action, RouteValueDictionary values) { MethodCallExpression body = action.Body as MethodCallExpression; if (body == null) { throw new InvalidOperationException("Expression must be a method call."); } if (body.Object != action.Parameters[0]) { throw new InvalidOperationException("Method call must target lambda argument."); } var actionName = body.Method.Name; var controllerName = typeof(T).Name; var area = SingletonBase <BasicControllerAreaRepo> .Instance.GetArea(typeof(T)); if (controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) { controllerName = controllerName.Remove(controllerName.Length - 10, 10); } var parameters = LinkBuilder.BuildParameterValuesFromExpression(body); values = values ?? new RouteValueDictionary(); values.Add("controller", controllerName); values.Add("action", actionName); if (!area.IsNullOrEmpty()) { values.Add("area", area); } if (parameters != null) { foreach (KeyValuePair <string, object> parameter in parameters) { values.Add(parameter.Key, parameter.Value); } } return(new RedirectToRouteResult(values)); }
private string GetLink() { MethodCallExpression call = LinkAction.Body as MethodCallExpression; string actionName = call.Method.Name; // TODO: Use better logic to chop off the controller suffix string controllerName = Controller.Name;// typeof(T).Name; if (controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) { controllerName = controllerName.Remove(controllerName.Length - 10, 10); } RouteValueDictionary values = LinkBuilder.BuildParameterValuesFromExpression(call); values = values ?? new RouteValueDictionary(); values.Add("controller", controllerName); values.Add("action", actionName); VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(_ctx, values); return(vpd.VirtualPath); }
public static RouteValueDictionary ParseExpression <T>(Expression <Action <T> > action) where T : Controller { var body = action.Body as MethodCallExpression; if (body == null) { throw new InvalidOperationException("Expression must be a method call"); } if (body.Object != action.Parameters[0]) { throw new InvalidOperationException("Method call must target lambda argument"); } var name = body.Method.Name; var str2 = typeof(T).Name; if (str2.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) { str2 = str2.Remove(str2.Length - 10, 10); } var values = new RouteValueDictionary { { "controller", str2 }, { "action", name } }; if (body.Method.GetParameters().Length > 0) { var methodParams = LinkBuilder.BuildParameterValuesFromExpression(body) ?? new RouteValueDictionary(); foreach (var methodParam in methodParams) { values.Add(methodParam.Key, methodParam.Value); } } return(values); }