我使用MVC4 razor构建了一个网站,我使用两种动作链接来重定向视图。 “@ Ajax.ActionLink”和“@ Html.ActionLink”。我有一个单独的注销视图,问题是,如果我正在调用@ Ajax.Action链接和会话已过期的视图,那么我的注销页面将在内部打开到主布局视图。我想在一个单独的视图中打开一个注销视图,每当我使用局部视图时都会发生同样的事情。
请告诉我如何使用ajax.actionlink解决此问题,或者在单独的视图中打开部分视图注销页面。
提前致谢..
答案 0 :(得分:1)
您需要做的是涉及服务器端和客户端编码。
首先,在服务器端,您需要捕获用户会话已经过期的请求,并且他们正在使用ajax。
如果您使用的是标准身份验证属性,则可以将其扩展为:
public class AjaxAuthorizeAttribute : AuthorizeAttribute
{
private class Http401Result : ActionResult
{
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.StatusCode = 401;
context.HttpContext.Response.Write("Your session has expired. Please login again to continue.");
context.HttpContext.Response.End();
}
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new Http401Result();
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
在您的Controller或Action上使用该属性而不是Authorize
。
现在到客户端,当一个请求从服务器返回时,你想要捕获它并做一些事情,让我们使用Ajax设置:
坚持这个人总会跑:
$(document).ready(function () {
$.ajaxSetup({
cache: false
});
$(document).ajaxError(
function (e, request) {
if (request.status == 401) {
alert("Your session has expired. Please login again to continue.");
window.location = "/account/logon";
} else {
}
}
);
}
你做完了。