【问题标题】:Calling MVC Method from JQuery UI Dialog without AJAX从没有 AJAX 的 JQuery UI 对话框调用 MVC 方法
【发布时间】:2009-07-18 10:59:08
【问题描述】:

我目前在我的网站上使用 JQuery UI 对话框。但是,我最近开始使用 MVC TempData 集合来通知我的对话框触发的各种操作的成功/失败。没有什么特别花哨或新的东西。但是,它提出了一个我找不到简单、明显的解决方案的问题。

在我的一些对话框中,我们会在成功提交数据后重定向到新页面。这些数据是使用 jQuery.Post 提交的,然后我们使用页面上的 window.location 进行成功提交的重定向。但是,这意味着我们在控制器方法中设置的任何 TempData 都不可用。有道理,因为它似乎需要 ActionResult 返回类型来处理这个。

所以,我的问题是,使用 JQuery UI 对话框,人们会建议作为一种在不使用 jQuery POST 或 AJAX 调用的情况下向控制器提交数据的方法。显然,我可以自己在对话框中嵌入一个表单并使用它,但是当它为您处理所有按钮等时,它似乎与使用 JQuery UI Dialog 的点相左。

也许我遗漏了一些非常明显的东西,但我们将不胜感激。非常感谢。

更新:这是整个 Action 方法。注意 - 这是一种实现,我实际上已经尝试了几种方法。但这是当前的实现。一旦调用了 Action,并且我们进行了客户端重定向,我设置的 TempData 就会显示为 NULL

[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
    public void RetireSelf(int playerKey)
    {
        PlayerDTO player = _playerTask.GetPlayer(playerKey);

        _log.Info("Player retiring themselves from ladder " + player.Name + player.PlayerKey);

        UserDTO user = _userTask.GetUser(CurrentUserName);

        if (user.UserKey != player.UserKey)
        {
            throw new LadderSecurityException(CurrentUserName + "trying to self retire another player");
        }

        _playerTask.RetirePlayer(playerKey);
        TempData["notification"] = "You were retired from the ladder.";
    }

【问题讨论】:

  • 你航行:“但是,这意味着我们在控制器方法中设置的任何 TempData 都不可用。有道理,因为它似乎需要 ActionResult 返回类型来处理这个问题。”您能否发布代码您如何在 POST 操作中使用 TempData?
  • 当然,这很简单。在 POST 动作中,我们有这行代码: TempData["notification"] = "Some notification goes here.";非常简单,但是在下一个请求中总是以 NULL 的形式出现。只有当我们通过非 AJAX 调用调用该方法时,它才会按预期出现。
  • 我已更新帖子以包含代码示例和一些信息。

标签: jquery asp.net-mvc ajax model-view-controller


【解决方案1】:

您可以从 RetireSelf 操作返回 JsonResult:

if(Request.IsAjaxRequest())
{
    return Json(new { Notification = "You were retired from the ladder."});
}

在客户端:

$.ajax({ url: ..., type: "POST", data: ..., dataType: "json",
    success: function(data) {
        var notification = data.Notification;
    }
});

【讨论】:

  • 虽然使用这种方法,如何在同一操作中处理重定向到另一个页面? JSON 数据不会在下一页上不可用吗?除非我通过查询字符串传递它,显然我想避免这样做。
  • 因为我最终想要做的是执行操作,离开页面,并显示通知消息。我可以显示通知,我可以处理页面重定向,但似乎不是两者合二为一。
  • 您也在 POST 上设置 TempData。在下一个请求中,来自 TempData 的信息应该存在。发布“下一页”操作中的代码 - 可能是该代码中的问题?您如何阅读“下一页”中的 TempData?
  • 啊,好建议。我发现出了什么问题。白痴我错过了这样一个事实,即我有一个基于某些参数进行重定向的临时操作,因此 TempData 由于该临时请求而被清空。现在效果很好。谢谢你的帮助!虽然它仍然给我留下了一个关于传递兴趣的问题......如果你以这种方式调用 Actions,没有简单的方法让他们自己进行页面重定向,你必须在客户端处理它,这似乎不太理想,不是吗?
  • 我也在通过在客户端设置 windows.location 来使用重定向,我不认为这个解决方案有问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
相关资源
最近更新 更多