2009-04-25 72 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