2014-01-21 56 views
1

我有一個頁面「ViewUser」。這種結構Html.RenderAction在RedirectToAction()之後失敗頁面

//display something about the user 
@{Html.RenderAction("UpdateUser", new { UserId = @Model.UserId });} 
//display some more stuff 

在爲UpdateUser兩個控制器方法我有

public ActionResult UpdateUser(int UserId){//populate form vars 
[HttpPost] 
public ActionResult UpdateUser(User u)// 
// code to update the user 
return RedirectToAction("ViewUser", new { User = u.UserId }); 

當我打開網頁,它工作正常我看到我的用戶數據,並在UpdateUser兩個表格的日期。 但是,當我更新用戶數據並從UpdateUser重定向到ViewUser頁面時,我得到 「子操作不允許執行重定向操作。」

但是再次手動打開頁面顯示更新成功。 據我瞭解,瀏覽器應該爲所有事情執行一個新的GET,所以我不明白爲什麼它適用於手動刷新,但是當UpdateUser返回重定向時不行。

回答

2

的錯誤是很清楚的:

Child actions are not allowed to perform redirect actions. 

當你直接調用一個動作(而不是作爲一個孩子的行動)這是responsibel來決定它返回到瀏覽器。所以它可以決定返回一個重定向。

但是,如果將此操作作爲子操作進行調用,則已經有一個主Action決定要返回到瀏覽器的內容,並要求此子操作呈現其他HTML。所以,如果子動作返回不同的東西,作爲重定向,它會失敗。

看到這,ChildActionExtensions.RenderAction Method

調用子操作方法並呈現在父視圖結果內嵌。

重定向或任何非HTML(View/PartialView結果)不能在父視圖內呈現。

你可以模擬從兒童行動「重定向」包括重定向頁面的腳本,通過包括它這個JavaScript(How can I make a redirect page in jQuery/JavaScript?):

window.location.replace('@Url.Action(...)'); 

反正你寧願從主做查看,通過使用您在部分上使用的相同邏輯來決定進行重定向。

+0

謝謝JotaBe。那麼,我怎樣才能將ViewUser作爲非子操作返回?這種模式有什麼問題嗎?我覺得這很自然嗎? – user2472565