【问题标题】:Redirect from controller during an Ajax.Actionlink call在 Ajax.Actionlink 调用期间从控制器重定向
【发布时间】:2015-07-01 22:12:29
【问题描述】:

我试图在 Ajax.Actionlink 调用过程中从我的控制器重定向。我有一个像这样的 Ajax.Actionlink:

@Ajax.ActionLink("Send a Project",
                 "RegisterAjax", "Projects",
                 new {id = Model.IncidentId},
                 new AjaxOptions {HttpMethod = "POST", UpdateTargetId = "Projectmsg_" + Model.IncidentId})

然后在我的控制器中,我有以下内容:

public ActionResult RegisterAjax(int id = 0)
        {
            string result = RegisterProject(id);
            if (result != null)
            {
                return RedirectResult(result);
            }
            return Content("Sent...");
        }

private ActionResult RedirectResult(string result)
        {
            throw new NotImplementedException();
        }

If result != null,我已经尝试了上述方法,return Redirect(result)return View(result) 等,但没有任何东西可以让我进入重定向的结果页面(例如 ~/Views/Manage/Location.cshtml)。我已经验证结果实际上是返回路径(通过在 return Content(result) 中返回它)。但是,当我单击超链接(即 Ajax.Actionlink)时,它完全没有响应,但我已经验证它在后台成功地完成了除了重定向之外的所有操作。

有人知道诀窍吗?非常感谢。

【问题讨论】:

  • ajax 的全部意义在于它停留在同一页面上。它不会重定向。
  • 是的,那是/主要是功能。因此,它所在的父页面显示来自数据库的表/网格,并且每一行都有一个链接(Ajax.Actionlink)。以前,当您单击链接时,它会执行此操作,然后将结果发送回表格单元格,效果很好。现在,我试图通过检查用户的位置是否已设置并在未设置的情况下将它们重定向到设置的位置页面来添加更多功能(在执行 ajax 调用实际执行的任何操作之前)。但是,似乎 ajax 的返回值非常有限?
  • Ajax 的返回内容完全不受限制。您似乎误解了ajax是什么。它用于保持在同一页面上(它永远不会重定向)。如果你想重定向,做一个正常的提交,或者返回一个值,表明你想去的 url 和使用 `location.href='yourUrl';
  • 我对Ajax的基本理解是,它只是简单地返回一组有限的数据而不刷新整个页面......?但是,如果数据必须传输到我的控制器,似乎我应该能够在途中的某个地方绕过整个过程?我想我误解了流程中的客户端/服务器关系以及每个人的角色/行为对于 ajax 调用是什么?
  • 是的,它“将数据返回到页面”,这意味着它不会重定向到另一个页面。

标签: c# ajax asp.net-mvc


【解决方案1】:

听起来您不需要 AJAX,最好使用带有 POST 操作的普通 HTML 表单。您应该能够在处理 POST 的操作中进行重定向。您有什么理由认为在这种情况下需要 AJAX?

【讨论】:

  • 嗨,请看我上面的回复,这可能更能说明为什么表单不一定是最佳选择。谢谢。
【解决方案2】:

根据上面与 Stephen 的 cmets,看来我正在尝试做的事情是不可能的(正如我之前想象的那样)。所以,我的“不想再花几天时间”的解决方案是基于达林在这里的回答:

Getting JSonResult from ASP's Ajax.ActionLink

我基本上将我的 Ajax.Actionlink 更改为 Html.Actionlink(我这样做是因为 Darin 推荐它,但也因为我可以在控制器中使用我的重定向,尽管毕竟没有在那里使用它):

    @Html.ActionLink("Send a Project", "RegisterAjax", "Projects", 
            new { Id = Model.IncidentId }, 
            new { id = "sendaproject_" + Model.IncidentId })

我删除了控制器中的if 语句(因为当我实现js 时它停止工作)并将返回结果更改为json(主要是因为我没有运气将return Content 数据导入js):

return Json(new { jsonResult = result }, JsonRequestBehavior.AllowGet);

然后,我添加了以下 javascript 来处理我想要的行为:

    <script type="text/javascript">
    $(function() {
        $('#sendaproject_@Model.IncidentId').click(function() {
        $.post(this.href, function(json) {
            if (json.jsonResult === null) {
                $("#projectmsg_@Model.IncidentId").html("Sent...");
            } else {
                window.location.href = json.jsonResult;
            }
            //alert(json.jsonResult);
        });
        return false;
    });
});
</script>

这是我对这个解决方案的问题:

  1. 我真的不明白为什么我一开始实现 javascript,控制器中的重定向就停止工作。控制器中的重定向似乎更干净......?
  2. javascript 直接位于每个 Html.Actionlink div 之后,因为 我想不出如何清理它,因为每个块都有一个唯一的 ID。我猜我需要命名我的 js 函数并将 id 传递给它?
  3. return Content 似乎发送回客户端的数据会更少,因为我只使用一条数据...?

该行为现在按需要/预期工作。但是,由于我还不知道自己在做什么,并且由于我并不真正了解从客户端到服务器的完整事件链(即行为),我希望我会在某些时候回到这个问题指出并更好地了解该做什么以及稍微清理一下...随时发表评论。我没有不安全感或容易被冒犯或试图成为这个网站上最聪明的人,所以请随意撕碎。谢谢。

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多