直接调用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
。
你真的应该使用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);
}
这是假设您的Edit
对OtherController
的操作以一个名为myGuid
的字符串作为参数。
如果有帮助请告诉我