簡體   English   中英

從不同的控制器直接調用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM