使用JsonResult重定向到操作

时间:2016-11-22 05:20:16

标签: c# asp.net-mvc

我有一个观点。当用户点击我视图中的按钮时,我试图从我的视图中获取一些数据,而不通过AJAX POST重新加载我的视图来显示一些数据。

这是我控制器中的方法:

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

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

[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以外的其他内容,因此无法正常工作。请帮我找到相同的解决方案。

4 个答案:

答案 0 :(得分:5)

如果您使用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'
}

答案 1 :(得分:4)

您无法使用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"
    }
  }
});

答案 2 :(得分:1)

试试吧

[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 - 执行HTTP重定向到指定的网址

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

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

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

  • ContentResult - 将内容写入响应流而无需视图

  • FileContentResult - 将文件返回给客户

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

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

答案 3 :(得分:0)

控制器

这是一个常用功能,可以根据需要用作通用功能

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