2011-11-02 41 views
4

我有以下的行動,從屏幕與記錄列表中調用。如何使MVC POST將我返回到上一頁?

[HttpPost] 
    //[Authorize(Roles = "admin")] 
    public ActionResult Edit(EditViewModel itemView) 
    { 

一旦動作已經完成,我想回到那裏的行動是從所謂的頁面。但是我不想刷新那個頁面。我只想使用類似於瀏覽器中的「上一個」按鈕回到填充的屏幕。現在,當我點擊「保存」我的行爲做以下這不是我想要的:

return RedirectToAction("Index"); 

是否有某種方式來重定向到前一頁與MVC3?

之後,我點擊編輯編輯答案,它返回到帖子後,像Stackoverflow功能。

回答

1

根據您提供的代碼,看起來您已經有分頁屏幕,並且可以在每行上單擊編輯。以下是我過去解決這個問題的方法。

在索引頁面,在頁面加載時,無論是從主索引或尋呼方法,添加以下內容:

Session["CurrentUrl"] = Request.Url.ToString(); 

所以現在,在POST方法的結尾你的編輯頁面,請執行以下操作:

return Session["CurrentUrl"] == null ? 
    Index() : 
    Redirect(Session["CurrentUrl"]); 
2

而是一個重定向,

[HttpGet] 
public ActionResult Index() 
{ 
    /// preform any processing necessary for your index page on GET 
    return View("Index"); 
} 

[HttpPost] 
public ActionResuit Edit(EditViewModel itemView) 
{ 
    if (ModelState.IsValid) 
    { 
    /// do whatever you want with your model... 
    } 

    // return the contents as they'd be rendered by the Index action 
    return Index(); 
} 

請注意,這個方法在瀏覽器的網址仍然會顯示編輯URL(如/area_name/edit),但您可以修復由:

  1. 使用重定向(你說過你不想這樣做)
  2. 使用JavaScript更新URL或使用history.back()作爲@AlanStephens建議
  3. 也許其他方法不會立即想到。

但是,我會質疑這是否是最好的方法。通常,用戶期望不同的URL可以做不同的事情。

或者,如果我理解正確和編輯的操作正在被從索引頁面調用,

[HttpGet] 
public ActionResult Index() 
{ 
    return View(); 
} 

[HttpPost] /// from a form on Index 
public ActionResult Index(EditViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
    //// 
    } 
    return View(); 
} 

,只是把/Edit出去遊玩完全。再一次,我並不真正關心這種方法。

+0

問題是,如果我返回到索引頁,那麼不會提供索引頁的新副本而不是已經填充的那個? history.back聽起來很有趣,但我在這篇文章中沒有看到任何提及。 –

+1

然後通過索引模型。例如:return View(model); – Jesse

+0

@samantha不,它不應該比任何其他表單提交更多地返回緩存頁面。 –

0

您描述的內容很容易使用ajax調用來實現。通過這種方式,您可以執行任何您喜歡的操作(事後響應),您可以使用JavaScript輕鬆地從當前頁面導航。

如果您POST到一個頁面並作爲響應返回與GET請求(索引頁面)一樣的視圖,那麼某些用戶可能會點擊F5來重新加載該索引頁面,並在瀏覽器中發出警告說它會再次發送POST請求。這對用戶來說相當混亂,並不是真正用戶友好(更不用說與它的同等性有關的許多問題)。

雖然你不喜歡重定向的方法,因爲額外的響應,我想,我應該說,在MVC中,這是正確的方式來做到這一點,假設你不想使用ajax調用。

相關問題