2012-10-03 14 views
7

AJAX से फ़ंक्शन को कॉल करते समय। कार्यक्रम प्रवाह समाप्त होने वाले सत्र को मान्यता नहीं देता है, मैं लॉगिन पेज पर रीडायरेक्ट नहीं करता हूं। इसके बजाए, यह रिकॉर्ड बचाता है। मैं सी # .net एमवीसी में काम कर रहा हूँ। तो AJAX कॉल के दौरान मैं सत्र कैसे संभाल सकता हूं। यहां मैंने अपने कोड दिए।एजेक्स को सी # एमवीसी नियंत्रक को कॉल करने पर सत्र समय को संभालना

$.ajax({ 
      type: "POST", 
      url:'/Employee/SaveEmployee', 
      data: 
      { 
       Location:$("#txtLocation").val(), 
       dateApplied:$("#txtDateApplied").val(), 
       Status:$("#ddStatus").val(), 
       mailCheck:$("#ddMailCheck").val(), 
       ... 
       ... 
       ... 
      }, 
      success: function (result) 
      { 

      }, 
      error: function (msg) 
      { 
      } 
     }); 

यहाँ नियंत्रक

[Authorize] 
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...) 
{ 
     objEmpMain.FirstName = firstName; 
     objEmpMain.LastName = lastName; 
     objEmpMain.Initial = Initial; 
     objEmpMain.Address1 = Address; 
     ... 
     ... 
     ... 
} 

उत्तर

23

आपके AJAX कॉल अभी भी होने की संभावना सफल दिखाई दे रहा खत्म हो जाएगा का परिणाम (हालांकि, चिंता मत करो, यह वास्तव में अपनी कार्रवाई विधि पर अमल नहीं होगा), और अपने success हैंडलर का आह्वान करें। ऐसा इसलिए है क्योंकि आप एचटीएमएल की उम्मीद कर रहे हैं, और यही वह है जो आप प्राप्त कर रहे हैं (यद्यपि, परिणामस्वरूप एचटीएमएल आपके लॉगिन पेज की संभावना है, न कि HTML जो आप चाहते थे)। एक तरफ, यदि आप JSON (dataType:'JSON' का उपयोग करके) की अपेक्षा करते हैं, तो यह एक त्रुटि ट्रिगर करेगा, क्योंकि यह JSON को JSON के रूप में पार्स कर देगा।

आपको AJA अनुरोधों के लिए लॉगिन पृष्ठ को पुनर्निर्देशित करने से FormsAuth को रोकने की आवश्यकता है। अब, AuthorizeAttribute ईमानदारी से NotAuthorizedResult देता है, जो क्लाइंट को HTTP 401 अधिकृत नहीं है, जो आपके AJAX क्लाइंट के लिए आदर्श है।

समस्या यह है कि FormsAuth मॉड्यूल StatusCode की जांच करता है और यदि यह 401 है, तो यह रीडायरेक्ट करता है। मैं इस तरह से इस मुद्दे combatted है:

1) AuthorizeAttribute के अपने खुद के व्युत्पन्न प्रकार बनाएं कि HttpContext.Items में एक ध्वज स्थानों मुझे पता प्राधिकरण विफल जाने के लिए, और मैं एक रीडायरेक्ट के बजाय एक 401 के लिए मजबूर करना चाहिए:

public class AjaxAuthorizeAttribute : AuthorizeAttribute 
{ 
    /// <summary> 
    /// Processes HTTP requests that fail authorization. 
    /// </summary> 
    /// <param name="filterContext">Encapsulates the information for using <see cref="T:System.Web.Mvc.AuthorizeAttribute"/>. The <paramref name="filterContext"/> object contains the controller, HTTP context, request context, action result, and route data.</param> 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) filterContext.HttpContext.Items["AjaxPermissionDenied"] = true; 

     base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

2) अपने Global.asax.cs में जोड़ें:

protected void Application_EndRequest(Object sender, EventArgs e) 
    { 
     if (Context.Items["AjaxPermissionDenied"] is bool) 
     { 
      Context.Response.StatusCode = 401; 
      Context.Response.End(); 
     } 
    } 

3) अपने jQuery AJAX सेटअप करने के लिए एक statusCode हैंडलर जोड़ें:

$.ajaxSetup({ 
    statusCode: { 
     401: function() { 
      window.location.href = "path/to/login"; 
     } 
    } 
}); 

4) नियंत्रक या कार्रवाई जहां AuthorizeAttributeAjaxAuthorizeAttribute करने का उपयोग करने से इस व्यवहार चाहते बदलें:

[AjaxAuthorize] 
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...) 
{ 
     objEmpMain.FirstName = firstName; 
     objEmpMain.LastName = lastName; 
     objEmpMain.Initial = Initial; 
     objEmpMain.Address1 = Address; 
     ... 
     ... 
     ... 
} 
+0

असल में मेरा वर्तमान वर्ग "पब्लिक क्लास कर्मचारी नियंत्रक: नियंत्रक" जैसा दिखता है। क्या आप मुझे "पब्लिक क्लास अजाक्सअधिकृत एट्रिब्यूट: AuthorizeAttribute" जैसे परिवर्तन करने के लिए निर्देशित करते हैं ???? –

+1

बस अपने नियंत्रकों या नियंत्रक कार्यों पर सजाए गए 'AjaxAuthorizeAttribute' के लिए' AuthorizeAttribute' को स्वैप करें। # 4 देखें जो मैंने अभी जोड़ा है। – HackedByChinese

+0

क्षमा करें, क्या आप मुझे समझा सकते हैं कि मुझे "पब्लिक क्लास अजाक्सअधिकृत एट्रिब्यूट: AuthorizeAttribute" क्लास बनाने की आवश्यकता है ??? –

1

मैं तुम्हें StatusCode = 306 उपयोग करने के लिए sugguest चाहते हैं मैं कुछ समस्या है जब उपयोग 401 से मुलाकात की। आईआईएस 401 से अलग है जो मैं समझता हूं उससे अलग है। 306 मेरे लिए ठीक काम करता है।

सम्मान।