Does .NET MVC ter um RedirectToAction fortemente tipado?
-
22-08-2019 - |
Pergunta
Desde que eu decidi deixar RC ir ao permanecer com Beta, por agora, eu não tenho nenhuma maneira de saber se um RedirectToAction
fortemente tipado foi adicionado. Alguém tentou fazê-lo e há uma RedirectToAction
fortemente tipado (e talvez ActionLink
) em RC?
Solução
Não, isso não acontece.
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);
}
Isso deve funcionar.
Outras dicas
Isso também está incluído na MVC Contrib como um método de extensão no seu controlador, juntamente com uma grande quantidade de outras guloseimas rigidez para um manuseamento ModelState, testando, etc. é bem a pena tomar sobre a dependência extra para que ela oferece.
Você pode usar return RedirectToAction(nameof(Index));
Se você não quer que a biblioteca MvcContrib cheia, você pode obter apenas este recurso usando a MvcNavigationHelpers pacote NuGet.