我有一个观点。当用户点击我视图中的按钮时,我试图从我的视图中获取一些数据,而不通过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
以外的其他内容,因此无法正常工作。请帮我找到相同的解决方案。
答案 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 是一个抽象类,可以有多个子类型。
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
}
}