asp.net-mvcmvccontribhttp-redirect

Does .NET MVC have a strongly typed RedirectToAction?


Since I have decided to let RC go while staying with Beta for now, I have no way of knowing whether a strongly typed RedirectToAction has been added. Has anybody tried it and is there a strongly typed RedirectToAction (and maybe ActionLink) in RC?


Solution

  • No, it doesn't.

    protected RedirectToRouteResult RedirectToAction<T>(Expression<Action<T>> action, RouteValueDictionary values) where T : Controller
    {
        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;
    
        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);
        }
    
        RouteValueDictionary defaults = LinkBuilder.BuildParameterValuesFromExpression(body) ?? new RouteValueDictionary();
    
        values = values ?? new RouteValueDictionary();
        values.Add("controller", controllerName);
        values.Add("action", actionName);
    
        if (defaults != null)
        {
            foreach (var pair in defaults.Where(p => p.Value != null))
            {
                values.Add(pair.Key, pair.Value);
            }
        }
    
        return new RedirectToRouteResult(values);
    }
    

    That should work.