Asp.net MVC 2, MvcContrib, et un contrôleur de base avec redirection des actions
-
20-09-2019 - |
Question
J'ai un contrôleur de base qui prend une couple de génériques, rien de trop de fantaisie.
public class SystemBaseController<TForm, TFormViewModel> : Controller
where TForm : class, IForm
where TFormViewModel : class, IViewModel
ok, pas de problème.J'ai une méthode "CompleteForm" qui prend dans le viewModel, regarde un peu comme ça ...
public ActionResult CompleteForm(TFormViewModel viewModel)
{
//does some stuff
return this.RedirectToAction(c => c.FormInfo(viewModel));
}
Problème, c'est le contrôleur qui hérite de ce, comme
public class SalesFormController : SystemBaseController<SalesForm, SalesViewModel>
{ }
Je finis par obtenir une erreur de MvcContrib - Contrôleur nom doit se terminer par "Contrôleur" à ce point ...
public RedirectToRouteResult(Expression<Action<T>> expression)
: this(expression, expr => Microsoft.Web.Mvc.Internal.ExpressionHelper.GetRouteValuesFromExpression(expr)) {}
L'expression qui est passée est correcte (SystemBaseController blahblah) mais je ne sais pas pourquoi sa 1.) en disant: il n'y a pas de contrôleur à la fin, et 2.) si je sors le tout dans le contrôleur (de la base), fonctionne très bien.Ai-je besoin d'écrire ou de configuration une sorte d'action de filtre de mes propres ou ce qui me manque?
La solution
OK, maintenant que je vois tout cela écrit, je crois que je vois le problème.
MvcContrib chiffres qui contrôleur d'appeler le déduire à partir de la expression lambda que vous avez passé en, pas le type de contrôleur.Donc quand vous dites this.RedirectToAction(c => c.FormInfo(viewModel));
, il ressemble à l'expression lambda et en déduit que T est de type SystemBaseController<TForm, TFormViewModel>
, pas SalesFormController.
Ce que vous avez à faire est de changer votre classe de base pour SystemBaseController<TForm, TFormViewModel, TController>
de sorte que vous pouvez dire this.RedirectToAction<TController>(c => c.FormInfo(viewModel));
.Qui pourrait fonctionner.