2012-05-14 23 views
7

मेरे पास एमवीसी को अजाक्स कॉल है जो आंशिक दृश्य देता है। सत्र समाप्त होने तक या कुकी समाप्त होने तक यह ठीक है। जब मैं AJAX कॉल करता हूं तो यह एक div के अंदर सामग्री प्रदर्शित करता है जिसका अर्थ आंशिक रूप से किया जाना था। मैं यह कैसे पता लगा सकता हूं कि मेरा सत्र अजाक्स कॉल के दौरान समाप्त हो गया है और पूर्ण स्क्रीन/पृष्ठएमवीसी 3/Jquery AJAX/सत्र की समाप्ति/सी # - हैंडलिंग सत्र टाइमआउट durng AJAX कॉल

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है, क्या आपको इसके लिए समाधान मिला है? – oqx

उत्तर

4

पर आप सही ढंग से रीडायरेक्ट कर सकते हैं आप क्लाइंट पर जावास्क्रिप्ट के साथ टाइमर बना सकते हैं जो सत्र के समय समाप्त होने पर उपयोगकर्ता को एक संवाद दिखाएगा । आप टाइमर का मान बस अपने सत्र के समय के अनुसार निर्धारित करेंगे। फिर AJAX अनुरोध पर, यह गिनती को भी रीसेट कर देगा।

var g_sessionTimer = null; 
function uiSessionInit() { 
    id = "uiTimeout"; 
    timeout = 3600000 * 24; // 1 day timeout 
    uiSessionSchedulePrompt(id, timeout); 
    $('body').ajaxStart(function() { 
     // reset timer on ajax request 
     uiSessionSchedulePrompt(id, timeout); 
    }); 
} 
function uiSessionSchedulePrompt(id, timeout) { 
    if (g_sessionTimer) 
     clearTimeout(g_sessionTimer); 
    g_sessionTimer = setTimeout(function() { uiSessionExpiring(id); }, timeout); 
} 
function uiSessionExpiring(id) { 
    // create a dialog div and use this to show to the user 
    var dialog = $('<div id="uiTimeout"></div>').text("Your session with has timed out. Please login again."); 
    $('body').append(dialog); 
    $('#uiTimeout').dialog({ 
      autoOpen: true, 
      modal: true, 
      title: 'Expired Session', 
      buttons: { 
       "OK": function(){ 
        $(this).dialog('close'); 
       } 
      }, 
      close: uiSessionDialogClose 
    }); 
} 

function uiSessionDialogClose(){ 
    // take user to sign in location 
    location = 'http://www.mypage.com'; 
} 
5

मैं एक आवरण तत्व में अपने सभी अनुरोधों encapsulating की सिफारिश करेंगे:

public class JsonResponse<T> 
{ 
    public JsonResponse() 
    { 
    } 

    public JsonResponse(T Data) 
    { 
     this.Data = Data; 
    } 

    public T Data { get; set; } 
    public bool IsValid { get; set; } 
    public string RedirectTo { get; set; } 
} 

क्या मॉडल आप अपने ग्राहक के लिए भेजना चाहते हैं डेटा में है।

रीडायरेक्ट प्राप्त करने के लिए, मैं ग्लोबल में GlobalAuthorize विशेषता का उपयोग करता हूं। एएक्सएक्स और handle for HandleUnauthorizedRequests जोड़ा।

public sealed class GlobalAuthorize : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest 
     (AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.Result = new JsonResult 
      { 
       Data = new JsonResponse<bool> 
         { 
          IsValid = false, 
          //RedirectTo = FormsAuthentication.LoginUrl 
          RedirectTo = "/" 
         }, 
       JsonRequestBehavior = JsonRequestBehavior.AllowGet 
      }; 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 

साथ ही, मैं एक ही समारोह जो RedirectTo लिए जाँच करता है में सभी मेरी अजाक्स अनुरोध समझाया गया है।

function global_getJsonResult(Controller, View, data, successCallback, completeCallback, methodType) 
{ 
    if (IsString(Controller) 
     && IsString(View) 
     && !IsUndefinedOrNull(data)) 
    { 
     var ajaxData; 
     var ajaxType; 

     if (typeof (data) == "string") 
     { 
      ajaxData = data; 
      ajaxType = "application/x-www-form-urlencoded" 
     } 
     else 
     { 
      ajaxData = JSON.stringify(data); 
      ajaxType = "application/json; charset=utf-8"; 
     } 
     var method = 'POST'; 

     if (!IsUndefinedOrNull(methodType)) 
     { 
      method = methodType; 
     } 

     var jqXHR = $.ajax({ 
      url: '/' + Controller + '/' + View, 
      data: ajaxData, 
      type: method, 
      contentType: ajaxType, 
      success: function(jsonResult) 
      { 
       if (!IsUndefinedOrNull(jsonResult) 
        && jsonResult.hasOwnProperty("RedirectTo") 
        && !IsUndefinedOrNull(jsonResult.RedirectTo) 
        && jsonResult.RedirectTo.length > 0) 
       { 
        $.fn.notify('error', 'Login Expired', 'You have been inactive for a prolonged period of time, and have been logged out of the system.'); 
        window.setTimeout(function() { window.location = jsonResult.RedirectTo }, 5000); 
       } 
       else if (IsFunction(successCallback)) 
       { 
        successCallback(jsonResult, Controller + '/' + View); 
       } 
      }, 
      error: function(jqXHR, textStatus, errorThrown) 
      { 
       if (errorThrown != 'abort') 
       { 
        $.fn.notify('error', 'AJAX Connection Error', textStatus + ': ' + errorThrown); 
       } 

      }, 
      complete: function(jqXHR, textStatus) 
      { 
       if (IsFunction(completeCallback)) 
       { 
        completeCallback(jqXHR, textStatus, Controller + '/' + View); 
       } 
      } 
     }); 

     return jqXHR; 
    } 
} 
+0

मैंने आपके रास्ते का उपयोग करने की कोशिश की, मेरा हैंडलअनुराइज्ड रिक्वेस्ट पूरी तरह से काम करता है, लेकिन यह कभी भी global_getJsonResult() विधि में नहीं आता है, क्या आप मुझे एक उदाहरण दे सकते हैं कि आपने अपनी jquery विधि को कैसे समेकित किया? – Bharat

+0

सुनिश्चित नहीं है कि आपका क्या मतलब है। उपर्युक्त उदाहरण में एक विधि है जो AJAX अनुरोधों को समाहित करती है और सभी अनुरोध मेरे जेएस कोड में उस विधि का उपयोग करते हैं। –

संबंधित मुद्दे