我有一种情况需要在不同的控制器中重定向到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
。
答案 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
的字符串作为参数。
如果有帮助,请告诉我。