2009-02-08 23 views
19

Como he decidido dejar ir a RC mientras estoy con Beta por ahora, no tengo forma de saber si se ha agregado un RedirectToAction fuertemente tipado. ¿Alguien lo ha probado y hay un RedirectToAction fuertemente tipado (y tal vez ActionLink) en RC?¿.NET MVC tiene un RedirectToAction fuertemente tipado?

+2

debe cambiar la respuesta aceptada a la respuesta de @Darrell Mozingo; porque RedirectToAction está realmente en el ensamblado Futures. –

Respuesta

17

No, no es así.

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); 
} 

Eso debería funcionar.

+1

¿Existe esto en Futures dll? no puedo encontrarlo, si lo hace? También me pregunto por qué se perdió? –

+0

Chad ... ¿cómo puede convertirse esto en un método de extensión para la clase Controller? –

+0

Recomiendo ponerlo en una clase base de Controladores y hacer que sus controladores hereden de eso. –

24

Esto también se incluye en MVC Contrib como un método de extensión en su controlador, junto con muchas otras ventajas muy tipadas para el manejo, prueba, etc. de ModelState. Vale la pena asumir la dependencia adicional de lo que ofrece.

+1

Esta es la respuesta correcta. –

0

Si no desea la biblioteca completa de MvcContrib, puede obtener solo esta característica utilizando el paquete NuGet MvcNavigationHelpers.

1

Puede utilizar return RedirectToAction(nameof(Index));

Cuestiones relacionadas