2016-10-13 74 views
1

我有一种情况,我需要重定向到不同控制器中的ASP.NET MVC动作。我无法使用RedirectToAction,因为我必须发布操作的参数以使其不在URL中。直接从不同的控制器调用ASP.NET控制器动作

我试图实例化和直接调用其他控制器的操作是这样的:

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

当我这样做,其他控制器的代码执行,但我结束了这个错误:

The model item passed into the dictionary is of type 'System.Data.Entity.DynamicProxies.OtherModel_BBCEF7C9378F4C4F097CC08FA2E508B8BD8D865E33093E31959919087A31348E', but this dictionary requires a model item of type 'ThisModel'.

有谁知道我是否可以使用当前的方法得到这个工作?假设我必须使用HTTP POST操作并且不能在URL中包含参数,是否有其他方法可以实现此结果(组合控制器除外)?
编辑:
请注意,我不认为我可以直接从客户端后,因为我需要窝Html.BeginForm

+0

请注意,我不认为我可以直接从客户端发布,因为我需要嵌套Html.BeginForm。 –

+0

因此,RedirectToAction调用中的RouteValues在这里不适用于您? –

+0

如果结果是URL中的参数,下降的任务是不可接受的。 –

回答

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

这是假设在OtherControllerEdit动作发生了一个名为作为参数字符串。

让我知道这是否有帮助。

+0

谢谢。这在原控制器操作中如何工作?我需要将模型返回到与OtherController中的“新”操作关联的视图。 –

+0

你可以从原来的控制器调用ExecuteOtherAction,然后返回一个新的EmptyResult()。当你调用将接管的'Execute'时,返回的是你的'OtherController.Edit'操作返回的内容。我正在使用这种方法,但我从'Global.asax'调用它;它在控制器内部工作(虽然我建议,但它看起来有点......)。你的'OtherController.Edit'操作返回什么? –

+0

该视图返回与原始控制器中使用的模型不同的自定义模型。我会给你一个机会,看看它是如何发展的。谢谢(你的)信息。 –

1

你应该真的只是使用RedirectToAction来推动浏览器到你想要的行动,而不是像这样做。从@Andrei Olariu代码中可以看到,在构建控制器(DI,然后是上下文和参数映射)期间,很多事情都是在引擎盖下发生的,这些事情不应该手动完成,并且很容易被搞砸导致浪费时间为什么某些事情没有按预期行事。

+0

我被授予URL中的参数不可接受的权限。在推回之前,我需要确保探索所有的选择。你的观点是赞赏和有效的。 –

相关问题