ASP.NET MVC和jQuery与TempData

3

我在一个视图中有一个链接,用户可以点击该链接调用ActionResult。链接如下:

<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重定向是否更好的做法(如果是,如何实现)?
2个回答

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);
                      });

我没有测试过,但你应该能理解这个意思。 如果你在火狐浏览器上安装了firebug,你可以看到$.post()方法返回的内容。

如果你想要进行一个“真正”的重定向并允许用户使用他的后退按钮,你也可以使$.post()返回要重定向到的视图的URL,然后使用location.href = data;来进行重定向。


2
为什么你要使用ajax来完成这个操作呢?直接让链接指向该动作(使用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来完成它,但对于大多数操作,我只会让链接连接到该操作。如果您确实有一个长时间运行的动作,那么我会在post的成功回调函数中将location.href设置为正确的URL,并让该操作返回文本消息或HTML(用于错误等)。不过,我认为你需要使用ajax方法来获取错误反馈。

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

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

在你提供的例子中,我正在做类似的事情,但我发现这种重定向方式之后TempData不可用。这不是你遇到的问题吗?我只能在Action执行重定向时访问TempData。任何客户端执行的重定向都会使TempData为空。 - pauldunlop
我看不出任何客户端活动如何影响服务器上的TempData。我需要检查源代码以确定TempData的存储方式以及在返回JSON时是否存储。我很久以前就回答过这个问题,但我认为我当时并没有打算在第二个示例中使用TempData。我的做法是发送错误消息。弹出对话框,然后在关闭对话框时重定向到返回的URL。 - tvanfosson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接