3

我有一个基本控制器,它需要几个泛型,没有什么特别花哨的。

public class SystemBaseController<TForm, TFormViewModel> : Controller
    where TForm : class, IForm
    where TFormViewModel : class, IViewModel

好吧,没什么大不了的。我有一个接受 viewModel 的方法“CompleteForm”,看起来有点像这样......

    public ActionResult CompleteForm(TFormViewModel viewModel)
    {
          //does some stuff

          return this.RedirectToAction(c => c.FormInfo(viewModel));
    }

问题是,继承这个的控制器,就像这样

public class SalesFormController :  SystemBaseController<SalesForm, SalesViewModel>
{ }

我最终从 MvcContrib 收到一个错误-此时控制器名称必须以“控制器”结尾...

    public RedirectToRouteResult(Expression<Action<T>> expression)
        : this(expression, expr => Microsoft.Web.Mvc.Internal.ExpressionHelper.GetRouteValuesFromExpression(expr)) {}

传入的表达式是正确的(SystemBaseController blahblah),但我不确定为什么它 1.)说最后没有控制器,以及 2.)如果我将所有东西都拉到控制器中(从底座中取出),就可以了正好。我是否需要编写或设置自己的某种动作过滤器,或者我缺少什么?

4

1 回答 1

2

好的,现在我看到所有这些都写出来了,我想我看到了问题所在。

MvcContrib 通过推断您传入的lambda 表达式而不是控制器类型来确定要调用的控制器。因此,当您说 时this.RedirectToAction(c => c.FormInfo(viewModel));,它会查看 lambda 表达式并推断 T 是 type SystemBaseController<TForm, TFormViewModel>,而不是 SalesFormController。

您可能需要做的是将您的基类更改为,SystemBaseController<TForm, TFormViewModel, TController>以便您可以说this.RedirectToAction<TController>(c => c.FormInfo(viewModel));. 那可能行得通。

于 2010-03-17T16:35:46.637 回答