【问题标题】:Redirect to action with JsonResult使用 JsonResult 重定向到操作
【发布时间】:2016-11-22 05:20:15
【问题描述】:

我有意见。当用户单击我视图中的按钮时,我试图从我的视图中获取一些数据,而无需通过 AJAX POST 重新加载我的视图以显示一些数据。

这是我控制器中的方法:

[HttpPost]
public JsonResult GetUserTraj()
{
    var userTrajList =
        DBManager.Instance.GetUserTraj(Session["UserName"].ToString());
    return Json(userTrajList);
}

这会返回一个 Json 结果。我现在正在尝试实施会话。因此,如果会话已过期,我希望将用户重定向到登录视图。在上述情况下,如果会话过期,Session["UserName"] 变为 null 并引发异常。

[HttpPost]
public JsonResult GetUserTraj()
{
    if (Session["UserName"] != null)
    {
        var userTrajList =
            DBManager.Instance.GetUserTraj(Session["UserName"].ToString());
        return Json(userTrajList);
    }
    else
    {
        RedirectToAction("Login", "Login");
        return Json(null);
    }
}

我尝试了上面的代码。但它不起作用。它不会将用户重定向到登录视图。我试过return RedirectToAction("Login", "Login");。但这不起作用,因为控制器操作方法不能返回 JsonResult 以外的东西。请帮我找到相同的解决方案。

【问题讨论】:

  • 将返回类型更改为ActionResult - 但请确保您的方法的用户正确处理重定向结果。
  • 如果您的操作的返回类型是 JsonResult,您不能重定向到操作。将其更改为 ActionResult 并在其他部分只写 return RedirectToAction("LogIn","LogIn");
  • 实际上我需要JsonResult 而不是ActionResult 在正常情况下。如果会话过期,我需要ActionResult。 @Rob & @JaiminDave
  • 是的。它工作正常。如有必要,只需在返回 json 中添加 JsonRequestBehavior.AllowGet 属性。如果一个动作返回不同类型的结果,你应该使用 ActionResult。
  • @ViVi。我想说的是,如果一个动作返回不同类型的结果,你应该使用 ActionResult。如果您使用 AJAX,您显然无法重定向到其他页面。只有得到回应后才能这样做。

标签: c# asp.net-mvc


【解决方案1】:

如果您使用 AJAX 请求页面,则无法在浏览器中重定向。 你应该响应一个状态码,然后在前面使用javascript重定向,像这样

[HttpPost]
public JsonResult GetUserTraj()
{
    if (Session["UserName"] != null)
    {
        var userTrajList =
            DBManager.Instance.GetUserTraj(Session["UserName"].ToString());
        return Json(userTrajList);
    }
    else
    {
        //RedirectToAction("Login", "Login");
        return Json(new {code=1});
    }
}

您需要在您的 Ajax 成功调用中写入此条件以重新加载登录屏幕,

if(result.code ===1){
    window.location = 'yourloginpage.html'
}

【讨论】:

  • 感谢您的帮助。
【解决方案2】:

您不能使用 ajax 将用户重定向到新页面。为此,您必须在客户端发送一些标志,然后需要使用该标志来识别该会话已过期。 以下代码将为您提供帮助:

[HttpPost]
public JsonResult GetUserTraj()
{
    if (Session["UserName"] != null)
    {
        var userTrajList = DBManager.Instance.GetUserTraj(Session["UserName"].ToString());
        return Json(new { Success = true, Data = userTrajList});
    }
    else
    {
        return Json(new { Success = false, Message = "Session Expired"});
    }
}

jQuery

$.ajax({
  url: "any url",
  dataType: '',
  contentType: "------",
  success: function(response){
    if(response.Success){
     // do stuff
    }else{
    window.location.href = "/YourLoginURL.aspx"
    }
  }
});

【讨论】:

    【解决方案3】:

    试试吧

    [HttpPost]
    public ActionResult GetUserTraj()
    {
        if (Session["UserName"] != null)
        {
            var userTrajList =
                DBManager.Instance.GetUserTraj(Session["UserName"].ToString());
            return Json(userTrajList);
        }
        else
        {
            RedirectToAction("Login", "Login");
            return Json(null);
        }
    }
    

    编辑

    如果您不重新加载页面,您的登录操作也应该返回 json 结果

    ActionResult 是一个抽象类,可以有多个子类型。

    ActionResult 子类型

    • ViewResult - 将指定的视图呈现给响应流

    • PartialViewResult - 将指定的部分视图呈现给响应流

    • EmptyResult - 返回一个空响应

    • RedirectResult - 执行到指定 URL 的 HTTP 重定向

    • RedirectToRouteResult - 执行 HTTP 重定向到由 路由引擎,基于给定的路由数据

    • JsonResult - 将给定的 ViewData 对象序列化为 JSON 格式

    • JavaScriptResult - 返回一段可在客户端执行的 JavaScript 代码

    • ContentResult - 无需查看即可将内容写入响应流

    • FileContentResult - 将文件返回给客户端

    • FileStreamResult - 将文件返回给客户端,由 Stream 提供

    • FilePathResult - 将文件返回给客户端

    【讨论】:

    • 是的,请查看我的更新答案以获取解释
    • 另外,看看这个。 stackoverflow.com/questions/26390806/…
    • 谢谢。我现在去看看。
    • 它没有重定向到登录视图。我想我需要在检查@Rwing 建议的响应后从 javascript 重定向
    • 是的,这最适合您的方案:+1 \
    【解决方案4】:

    控制器

    这是一个通用函数,可以根据需要用作通用函数

     public void logoutJson()
         {
            Response.StatusCode = (int)HttpStatusCode.BadRequest; //Send Error Status to Ajax call
            Response.StatusDescription = Url.Action("Index", "Account"); //Url you want to redirect
         }
    

    脚本

    只需将此代码粘贴到您要使用的查看页面中即可。所以它会自动处理你想要的所有 AJAX 调用。

      $(document).ready(function () {
            $.ajaxSetup({
                'complete': function (xhr, textStatus) {
                   if (xhr.status!="200") {
                        window.location.replace(xhr.statusText); //Redirect to URL placed in Response.StatusDescription
                    }
                }
            });
    
        });
    

    示例

    只需调用手动失败 AJAX 请求的函数和客户端句柄中的脚本即可重定向到登录页面。

     public JsonResult TestAction()
        {
            if (null == Session["EmpId"]) 
              {
                logoutJson(); //Just call the function 
              }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多