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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }