2012-10-03 17 views
7

ajax işlevini çağırırken. Program akışı, süresi dolan oturumu tanımıyor, yani giriş sayfasına yönlendirmiyor. Bunun yerine kaydı kaydeder. Ben C# .net mvc çalışıyorum. Peki ajax çağrısı yaparken oturumu nasıl ele alabilirim. İşte kodlarımı verdim. İşte C# mvc denetleyicisine ajax çağrısı çalışmadığında oturum zamanının işlenmesi

$.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) 
      { 
      } 
     }); 

kontrolör

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

cevap

23

hala olasılıkla başarılı görünen sona erecek AJAX çağrı sonucu, (merak etmeyin, her ne kadar, aslında eylem yöntemini yürütmek olmaz) ve senin success işleyicisini çağır. Bunun nedeni HTML’yi beklemeniz ve aldığınız şeydir (sonuçta ortaya çıkan HTML büyük olasılıkla giriş sayfanızdır ve istediğiniz HTML’dir). Bir kenara göre, JSON (dataType:'JSON' kullanarak) beklediyseniz, bir hata tetikleyecektir, çünkü HTML'yi JSON olarak ayrıştırmaktadır.

Yapmanız gereken şey, FormsAuth'ın AJAX istekleri için giriş sayfasını yeniden yönlendirmesini önlemektir. Artık, AuthorizeAttribute, AJAX istemciniz için ideal olan, istemciye bir HTTP 401 Yetkilendirilmemiş yanıtı gönderen bir NotAuthorizedResult döndürür.

Sorun, FormsAuth modülünün StatusCode'u denetlemesi ve eğer 401 ise, yönlendirmeyi gerçekleştirmesidir. Ben bu şekilde bu sorunu konusunda mücadele ettik:

1) AuthorizeAttribute benim kendi türev türünü oluşturma bana yetkilendirme başarısız bildirmek için HttpContext.Items bir bayrak yerleştirir ve bir yönlendirme yerine 401 zorlamak olmalıdır:

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) sizin Global.asax.cs ekleyin:

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

3) jQuery AJAX kurulum için bir statusCode işleyicisi ekleyin:

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

4) AuthorizeAttributeAjaxAuthorizeAttribute kullanarak bu davranışı istediğiniz denetleyicileri veya eylemleri değiştirin:

[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

Aslında benim şu anki sınıfım "public class EmployeeController: Controller" gibi görünüyor. Aşağıdaki "public class AjaxAuthorizeAttribute: AuthorizeAttribute" gibi değişmemi mi söylüyorsunuz ???? –

+1

Sadece "AjaxAuthorizeAttribute" için "AuthorizeAttribute" işlevini denetleyicilerinizde veya denetleyici eylemlerinizde dekore ettiniz. Yeni eklediğim # 4'e bakın. – HackedByChinese

+0

Maalesef, "public class AjaxAuthorizeAttribute: AuthorizeAttribute" sınıfını nerede oluşturacağımı açıklayabilir misiniz ??? –

1

Sana statusCode = 306 kullanmak sugguest istiyorum ben biraz problem kullanımı 401 araya geldi. IIS, 401'i anladığımdan farklı bir şekilde ele alıyor. 306 benim için iyi çalışıyor.

Saygılarımızla.