【问题标题】:ASP.NET MVC and jQuery with TempData带有 TempData 的 ASP.NET MVC 和 jQuery
【发布时间】:2009-04-25 23:30:05
【问题描述】:

我的一个视图中有一个链接,用户可以单击该链接调用 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 重定向是不是更好的做法(如果是,怎么做)?

【问题讨论】:

    标签: jquery asp.net-mvc


    【解决方案1】:

    您的 javascript 只是调用控制器操作,但它不会对返回的值做任何事情(在这种情况下,它重定向到的视图中的 html)。

    您应该创建一个回调函数并将当前的 html 替换为 javascript $.post() 调用返回的 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 浏览器上安装了 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 看到它,但对于大多数动作,我只会让链接连接到动作。如果你确实有一个长时间运行的动作, 然后我会让你的帖子成功回调,只需将 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 无效。
      • 我看不出任何客户端活动如何影响服务器上的 TempData。我必须检查源代码以确切了解 TempData 的存储方式以及返回 JSON 时是否存储了它。我很久以前就回答了这个问题,但我不认为我打算在第二个示例中使用 TempData。我这样做的方法是发回错误消息。弹出一个对话框,然后在对话框关闭时重定向到返回的 url。
      猜你喜欢
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 2011-12-18
      相关资源
      最近更新 更多