直接调用ASP.. NET控制器操作来自不同的控制器

本文关键字:控制器 操作 调用 ASP NET | 更新日期: 2023-09-27 18:13:09

我有一个情况,我需要重定向到一个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

直接调用ASP.. NET控制器操作来自不同的控制器

你真的应该使用RedirectToAction来把浏览器推送到你想要的动作,而不是像这样尝试。正如你从@Andrei Olariu的代码中看到的,在你的控制器(DI然后是上下文和参数映射)的构建过程中,很多事情都是在底层发生的,这些事情真的不应该手工完成,而且很容易搞砸,导致你浪费了几个小时的时间,想知道为什么某些事情没有像预期的那样表现。

我希望我明白你在做什么。这就是我成功地在另一个控制器上执行操作的方法。

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);
}

这是假设您的EditOtherController的操作以一个名为myGuid的字符串作为参数。

如果有帮助请告诉我