ASP.NET MVC 4 アプリケーションがあり、セッション タイムアウトを処理するためにセッション タイムアウト フィルター ハンドラーでセッション タイムアウトをトラップしています。また、ajax リクエストのセッション タイムアウトも処理したいと考えています。この質問で見つけたコードを最初に実装しましたhere 。
これは、最初はオートコンプリートやその他の ajax 呼び出しでうまくいきましたが、唯一の問題は、モーダル ポップアップへの ajax 呼び出しです!
そのため、セッション タイムアウト ハンドラを次のように変更しました。
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Session != null)
{
if (filterContext.HttpContext.Session.IsNewSession)
{
var sessionStateDetails =(SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState");
var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"];
if ((sessionCookie != null) && (sessionCookie.IndexOf(sessionStateDetails.CookieName) >= 0))
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
つまり、ステータス コードを 500 に設定します (Windows 認証と偽装を使用しているため、401 は機能しませんでした。ステータスを 401 に変更すると、パスワードとユーザー名のセキュリティ ポップアップが表示されます)。
そして、これを .ajaxSetup または .ajaxError のいずれかにトラップし、両方を試しました...そしてセッションタイムアウトアクションにリダイレクトして(必要に応じて)、セッションタイムアウトでビューを表示します。
$(document).ajaxError(function (xhr, props) {
if (props.status === 500) {
////session redirect goes here
var pathArray = window.location.pathname.split('/');
var segment_1 = pathArray[1];
var newURL = window.location.protocol + "//" + window.location.host + "/" + segment_1 + "/Home/SessionTimeout";
window.location = newURL;
}
});
問題はリダイレクトの前にあり、ajax ポップアップはまだ短時間開いています。だから、見栄えがよくありません。どうすればそれがまったく開かず、スムーズにリダイレクトされるのを防ぐことができますか?
これが私のjQueryダイアログコードです:
$(document).ready(function () {
$(".openDialog").live("click", function (e) {
e.preventDefault();
$("<div></div>")
.addClass("dialog")
.attr("id", $(this)
.attr("data-dialog-id"))
.appendTo("body")
.dialog({
title: $(this).attr("data-dialog-title"),
close: function () { $(this).remove() },
width: 600,
modal: true,
height: 'auto',
show: 'fade',
hide: 'fade',
resizable: 'false'
})
.load(this.href);
});
$(".close").live("click", function (e) {
e.preventDefault();
$(this).closest(".dialog").dialog("close");
});
});
どんな助けでも大歓迎です、私はこれでほとんどそこにいると思います。