[英]Call another controller and use a different Layout for the called controller action MVC ASP.NET
[英]Directly call ASP.NET controller action from a different controller
我有一種情況,我需要重定向到不同控制器中的 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
作為參數。
如果這有幫助,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.