Ist .NET MVC eine stark typisierte RedirectToAction haben?
-
22-08-2019 - |
Frage
Da habe ich beschlossen, lassen RC gehen, während mit Beta bleiben für jetzt habe ich keine Möglichkeit zu wissen, ob eine stark typisierte RedirectToAction
hinzugefügt wurde. Hat jemand versucht, es und gibt es einen stark typisierte RedirectToAction
(und vielleicht ActionLink
) in RC?
Lösung
Nein, es funktioniert nicht.
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);
}
Das sollte funktionieren.
Andere Tipps
Dies ist auch in MVC Contrib enthalten als Erweiterung Methode auf dem Controller, zusammen mit einer Menge von andere stark typisierte Leckereien für Model Handhabung, Prüfung, usw. es lohnt sich auf die zusätzliche Abhängigkeit nehmen für das, was er anbietet.
Sie können mit return RedirectToAction(nameof(Index));
Wenn Sie nicht die volle MvcContrib Bibliothek wollen, können Sie einfach diese Funktion erhalten, indem Sie die MvcNavigationHelpers NuGet Paket.