直接从其他控制器调用ASP.NET控制器操作

时间:2016-10-13 18:25:21

标签: c# asp.net-mvc http

我有一种情况需要在不同的控制器中重定向到ASP.NET MVC操作。我不能使用RedirectToAction,因为我必须POST动作的参数以使它们不在URL之外。

我尝试实例化并直接调用其他控制器的操作:

OtherController myOtherController = new OtherController();
myOtherController.ControllerContext = new ControllerContext(this.ControllerContext.RequestContext, myOtherController);
return await myOtherController.Edit(myGuid);

当我这样做时,其他控制器的代码会执行,但我最终会遇到这个错误:

  

传递到字典中的模型项是类型的   'System.Data.Entity.DynamicProxies.OtherModel_BBCEF7C9378F4C4F097CC08FA2E508B8BD8D865E33093E31959919087A31348E',   但是这个字典需要一个'ThisModel'类型的模型项。

有谁知道我是否可以使用当前的方法来实现这一目标?假设我必须使用HTTP POST操作并且不能在URL中包含参数,是否有不同的方法建议您实现此结果(除了组合控制器)? 修改
请注意,我认为我不能直接从客户端发帖,因为我需要嵌套Html.BeginForm

2 个答案:

答案 0 :(得分:1)

您应该只是使用RedirectToAction将浏览器推送到您想要的操作,而不是像这样尝试。正如您从@Andrei Olariu代码中看到的那样,在控制器构建过程中会发生很多事情(DI然后是上下文和参数映射),这些操作实际上不应该手动完成,并且很容易被搞砸,导致数小时浪费了,为什么某些事情没有达到预期的效果。

答案 1 :(得分:0)

我希望我理解你要做的事情。这就是我成功用于在不同控制器上执行操作的内容。

private void ExecuteErrorAction(string action, HttpContextWrapper httpContext, Exception exception)
{
    var routeData = new RouteData();
    routeData.Values["controller"] = "Error";
    routeData.Values["action"] = action;
    routeData.Values["exception"] = exception;

    IController errorController = DependencyResolver.Current.GetService<ErrorController>();
    var context = new RequestContext(httpContext, routeData);
    errorController.Execute(context);
}

我认为在你的情况下,这可能看起来像:

private void ExecuteOtherAction(string myGuid, HttpContextWrapper httpContext)
{
    var routeData = new RouteData();
    routeData.Values["controller"] = "OtherController";
    routeData.Values["action"] = "Edit";
    routeData.Values["myGuid"] = myGuid;

    IController otherCntroller = DependencyResolver.Current.GetService<OtherController>();
    var context = new RequestContext(httpContext, routeData);
    otherCntroller.Execute(context);
}

这假设您对Edit的{​​{1}}操作采用名为OtherController的字符串作为参数。

如果有帮助,请告诉我。