Hace .NET MVC tiene un RedirectToAction inflexible?
-
22-08-2019 - |
Pregunta
Desde que he decidido dejar RC ir durante su estancia con Beta por ahora, no tengo manera de saber si un RedirectToAction
fuertemente tipado se ha añadido. Cualquiera ha intentado y no es un RedirectToAction
fuertemente tipado (y tal vez ActionLink
) en RC?
Solución
No, no lo hace.
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.
Otros consejos
Esto también se incluye en MVC Contrib como un método de extensión en el controlador, junto con una gran cantidad de otras golosinas inflexible de tipos para el manejo ModelState, pruebas, etc. vale la pena tomar en la dependencia extra para lo que ofrece.
Puede utilizar return RedirectToAction(nameof(Index));
Si no desea que la biblioteca MvcContrib completa, se puede obtener sólo esta característica mediante el uso de la MvcNavigationHelpers paquete NuGet.