首页 新闻 会员 周边

在MVC中ajax访问出现异常时怎么处理?

0
悬赏园豆:5 [已解决问题] 解决于 2015-08-14 14:25

在mvc,你通过ajax去访问一个action的时候,action里面会用到session["userinfo"],这个时候失效了,你判断了session的状态想在为空的时候转向去登录页面,因为你是用ajax来访问的。结果还是停留在当前页面。

 

对于这样的情况,各位菊苣一般都是怎么处理的?

Vincent8464的主页 Vincent8464 | 初学一级 | 园豆:17
提问于:2015-08-10 18:00
< >
分享
最佳答案
0

在你需要登陆验证的action上 加上一个Authentication

如下:

[MyAuthentication]
public ActionResult Index()
{ 
return View();
}

 

MyAuthentication.cs

 

public class MyAuthentication : AuthorizeAttribute

{

    

protected override bool AuthorizeCore(HttpContextBase httpContext)
{

...



}

protected override void HandleUnauthorizedRequest(AuthorizationContext context)
{
if (context == null)
{
throw new ArgumentNullException("filterContext");
}
else
{
string requestType = context.HttpContext.Request.Headers["X-Requested-With"];
if (!string.IsNullOrEmpty(requestType) && requestType.Equals("XMLHttpRequest", StringComparison.CurrentCultureIgnoreCase))
{
context.HttpContext.Response.AppendHeader("sessionstatus", "timeout");
context.HttpContext.Response.StatusDescription = "session timeout.";
return;
}
string path = context.HttpContext.Request.Path;
string loginUrl = ".......";

context.HttpContext.Response.Redirect(loginUrl, true);

}

}

}

 

前端js:

$.ajax({
type: "POST",
url: url,
data: data,
datatype: "json",
success: function (d) {

},
error: function (xhr, status) {
if (!AjaxPostSessionFailure(xhr, status, window)) {

} else {
}
}
}); //ajax

function AjaxPostSessionFailure(xhr, status, window) {
var isFail = false;
var sessionStatus = xhr.getResponseHeader('sessionstatus');
if (sessionStatus == 'timeout') {
var top = window.top;
var yes = confirm('由于您长时间没有操作, session已过期, 请重新登录.');
if (yes) {
top.location.reload();
}
else {
isFail = false;
}
}
return isFail;
}

 

收获园豆:5
clarlespeng | 菜鸟二级 |园豆:469 | 2015-08-13 14:28

这位兄弟好强,直接给出代码。。。。楼主你要是不给分真不够意思了

一伙豌豆 | 园豆:209 (菜鸟二级) | 2015-08-13 16:16
其他回答(4)
0

那你就多封装一个东西呗。。。一般你可以返回三个字段:code和message,url,如果code等于你自定义的未登录的状态就跳转到url呗。。。

顾晓北 | 园豆:10844 (专家六级) | 2015-08-10 18:19
0

建一个基类 。Public  Class   ModelBase{
                  public int Errcode{get;set;}   //状态码,这个你自己定义

                  public string Message{get;set;}   //一般提示信息

                   public string Url{get;set;}    //处理后需要进行跳转的地址

                   public  object  data{get;set;}  //这个可以无视,部分需要返回数据集

                   }

建好这么一个基类之后。你Ajax请求Action进行操作的时候,先实例化一手这个实体。然后在你判断session["userinfo"]是不是空的时候开始赋值。   modelbase.Errcoe=-200;modelbase.Message="信息为空";  modelbase.Url="你需要跳转的地址"。 在return  的时候    return base.json(modelbase)即可。然后前面的ajax  success里返回的(data)。你只需要data.ErrCode>0等判断,然后就做自己想做的事情就行。或者直接在Action里。return RedirectToAction("Action", "Controller"); 。

大楚打码人 | 园豆:4313 (老鸟四级) | 2015-08-11 09:31
0

你再action判断,如果为空 返回 return this.Json(new {Result:string.Empty,Error: 0});

js接受时,如果data.Error === 0 ,window.location.href 跳转

伤心懒睡猪 | 园豆:346 (菜鸟二级) | 2015-08-11 09:50

偶觉得你很有道理。赞

支持(0) 反对(0) NewBigGod | 园豆:182 (初学一级) | 2015-08-11 16:30
0

楼主可以试试建立一个过滤器,加载action上。过滤器的规则就是遇到无效的session进行跳转。ajax访问的时候看看会不会跳转,我没有试过哦。

一伙豌豆 | 园豆:209 (菜鸟二级) | 2015-08-11 16:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册