2010-01-13 66 views
21

我有我與Asp.Net期貨法的RenderAction使一些局部動作。這些表格中的一些已經處理後執行重定向。現在爲什麼重定向結果未在兒童操作中允許Asp.net MVC 2

,我升級到Asp.Net MVC 2 RC它給了我一個錯誤「孩子的行爲是不允許進行重定向操作」。

我檢查了源代碼,我發現,拋出異常的線。爲了解決這個問題,我可以創建一個自定義的RedirectResult,但是在我之前,我想了解爲什麼框架首先不允許它。必須有一個很好的理由,也許我不應該這樣做。

任何人都知道這個限制的原因?

謝謝

回答

32

限制存在,因爲MVC已經開始渲染一個視圖到客戶端。從這一點重定向的影響是未定義的。它可以很好地工作,它可以繼續繪製原觀點沒有重定向,它可以拋出一個不同的異常等

由於在執行此操作的結果是不確定的,框架阻止它。實際上,出於類似的原因,RenderAction不應該用於呈現除視圖之外的其他任何內容(或類似於視圖的內容)。

在你的特定情況下,外部動作應該重定向。如果你只是最終從視圖中重定向而不向用戶展示任何東西,那麼首先完全沒有意圖通過視圖,因爲外部行爲可能已經將工作委託給它的適當位置擁有。

1

在這種情況下,只需在局部視圖表單提交的URL,這是你的問題的重定向的目標採取行動,讓它執行自身重定向的GET版本。

6

在我的情況下,所呈現的形式是一個擴展到一個網站我建立一個「配置」面板。我希望擴展程序自己的控制器能夠處理表單處理,然後重定向回管理頁面列出所有配置的擴展。我不認爲在這裏要求父頁面的控制器處理擴展表單是不恰當的或不實際的。你會建議我做什麼呢?

+0

這是同樣的情況我有。由於我只是在管理頁面上使用它來實現可擴展性,我決定將重定向保留在子操作控制器中。我編寫了自己的ChildActionRedirectResult,然後創建了一個覆蓋重定向方法的ChildActionController庫來使用我自己的結果。我不會這樣做前端使用。 – Sruly 2010-02-03 12:50:33

+0

我最終只是返回一個簡單的查看結果,其中包含「您的更改已保存」消息以及返回管理頁面的用於管理擴展的鏈接。這不是很好,但它的確有竅門。 – 2010-02-05 19:18:11

3

有時,當您嘗試呈現基本操作結果的操作時會發生此錯誤。 例如:

ActionResult X 
    Return View 
View X 
    RenderAction Y 

ActionResult Y 
    // Bla bla 
     return View 
    // else 
     return RedirectToAction X 
12

我的解決方案。

操作方法:

return View("Redirect", model); 

查看:

<script type="text/javascript" language="javascript"> 
    document.location = '<%: Url.Action("Index", "Album", new { id = Model.Id }) %>';</script> 
17

嘗試使用這樣的事情在兒童行動:

ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString()); 
+1

我在一個登錄操作中使用了此操作,顯示爲需要在成功登錄時重定向的主頁的部分視圖 – user1760527 2014-11-29 11:31:15

+0

這實際上會導致客戶端瀏覽器在收到重定向標頭後重新請求該頁面,但它工作得很好。 – 2017-02-13 03:16:32

5

在我的不尋常的情況下,我做了一個自定義的AuthorizeAttribute附在我的控制器上,這個控制器正試圖重定向一個兒童行爲,這是(如上所述)而不是異步行爲星期三。

要解決這個問題,我刪除了授權對所有孩子的行動檢查重定向:

Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext) 
    //Child actions cannot redirect anyway, so no need to check permissions. 
    If filterContext.IsChildAction Then Exit Sub 

    .. parent authorisation checks .. 
相關問題