2009-04-25 87 views
3

我有一個鏈接在我的意見中,用戶可以點擊調用ActionResult。這個鏈接是像這樣:ASP.NET MVC和jQuery與TempData

<a class="do_something" href="#">lorem ipsum</a> 

然後我有一些JavaScript代碼的帖子到的ActionResult(沒有傳遞到的ActionResult無數據),像這樣:

$("a.do_something").click(function() { 
    var urltopost = "/foo"; 

    $.post(urltopost); 
    return false; 
}); 

的ActionResult的打算再做什麼的,就像這樣:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult foo() 
    { 
     //do something here 

     TempData["Success"] = "You have successfully done something"; 
     return RedirectToAction("Index", "Home"); 
    } 

我希望有發生的是,當用戶點擊該鏈接時,ActionResult的就執行,然後將用戶重定向到另一個視圖,顯示ŧ他TempData消息讓他們知道一切工作正常。

一切工作正常,除了重定向部分。當鏈接被點擊時,ActionResult被調用,並且它執行它應該做的事情,但是視圖不被重定向。

問題是,如何在ActionResult發生什麼事情時將用戶重定向到所需的視圖?從jQuery重定向是否是更好的做法(如果是這樣,怎麼做)?

回答

4

您的JavaScript只是調用控制器操作,但它不會對返回的值做任何操作(在這種情況下,它將重定向到的視圖中的html)。

您應該創建一個回調函數,並用javascript $ .post()調用返回的html代替當前的html。

作爲一個例子,這裏是我的一些代碼,職位形式返回一個局部視圖控制器動作:

  var f = $("#FilterProfile"); 
      var action = f.attr("action"); 
      var serializedForm = f.serialize(); 
      $.post(action, 
       serializedForm, 
       function(data) { 
        $("tbody").html(data); 
       }); 

你的代碼應該是這樣的:

    $.post("/foo", 
         function(data) { 
          $("html").replaceWith(data); 
         }); 

我沒有測試它,但你應該得到的圖片。 如果您的FF瀏覽器上安裝了螢火蟲,您可以看到$ .post()方法返回的內容。

如果你想要做一個「真正」的重定向,使用戶使用他的後退按鈕,你也可以讓$。員額()返回視圖的URL重定向到,然後用location.href = data;做重定向。

2

爲什麼你甚至只是這個阿賈克斯?只需將鏈接直接轉到操作(使用GET)即可。

<a class="do_something" href='/foo'>lorem ipsum</a> 

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult foo() 
{ 
    // do something 

    TempData["Success"] = "You have successfully done something"; 
    return RedirectToAction("Index","Home"); 
} 

我可以看到通過jQuery做,如果動作是一個長期運行的行動,並要提供一個微調或東西來表示工作是怎麼回事,但對於大多數的行動,我只想有鏈路連接行動。如果你確實有一個長時間的行動, 然後我會有你的成功回調的帖子,只需將location.href設置爲正確的Url - 並讓該操作返回一條文本消息或html(對於錯誤等)。我認爲你需要使用ajax方法來獲取錯誤反饋。

$("a.do_something").click(function() { 
    var urltopost = "/foo"; 

    $.post(urltopost, null, function() { location.href = "/home"; }); 
    return false; 
}); 
+0

在這個例子中,你已經給出了,我正在做一些非常相似的事情,但是我發現在你這樣做重定向之後TempData不可用。這不是你有的問題嗎?我只能通過Action完成重定向時訪問TempData。我做客戶端的任何重定向都會導致TempData無效。 – pauldunlop 2009-07-18 13:48:42