2011-11-29 10 views
5

मेरे पास Ajax.ActionLink है जिसके परिणामस्वरूप आंशिक दृश्य लौटाया जा रहा है। हालांकि, अगर मेरी FormsAuthentication की समयसीमा समाप्त हो जाती है और उपयोगकर्ता को फिर से लॉगिन करने की आवश्यकता होती है, तो संपूर्ण लॉगिन पृष्ठ आंशिक दृश्य के रूप में वापस कर दिया जाता है।Ajax.ActionLink div के भीतर लॉगिन पृष्ठ लौटाता है जब उपयोगकर्ता को फिर से लॉगिन करने की आवश्यकता होती है

इसके परिणामस्वरूप पूर्ण लॉगिन पृष्ठ div में दिखाई देता है जो मैंने आंशिक दृश्य के लिए अलग रखा है। तो यह पेज पर दो वेब पेजों की तरह दिखता है।

मैं अपने नियंत्रक और कार्यों पर [Authorize] विशेषता का उपयोग कर रहा हूं।

मैं लॉगिन पृष्ठ को पूर्ण दृश्य के रूप में वापस करने के लिए कैसे मजबूर कर सकता हूं?

उत्तर

5

आप [Authorize] विशेषता का विस्तार कर सकते हैं ताकि आप HandleUnauthorizedRequest फ़ंक्शन को अपने AJAX कॉल पर JsonResult वापस करने के लिए ओवरराइड कर सकें।

public class AuthorizeAjaxAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext 
                 filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      // It was an AJAX request => no need to redirect 
      // to the login url, just return a JSON object 
      // pointing to this url so that the redirect is done 
      // on the client 

      var referrer = filterContext.HttpContext.Request.UrlReferrer; 

      filterContext.Result = new JsonResult 
      { 
       JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
       Data = new { redirectTo = FormsAuthentication.LoginUrl + 
          "?ReturnUrl=" + 
          referrer.LocalPath.Replace("/", "%2f") } 
      }; 
     } 
     else 
      base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

बनाएँ जावास्क्रिप्ट समारोह रीडायरेक्ट संभाल:

<script type="text/javascript"> 
    function replaceStatus(result) { 
     // if redirectTo has a value, redirect to the link 
     if (result.redirectTo) { 
      window.location.href = result.redirectTo; 
     } 
     else { 
      // when the AJAX succeeds refresh the mydiv section 
      $('#mydiv').html(result); 
     } 
    }; 
</script> 

और फिर अपने Ajax.ActionLink

Ajax.ActionLink("Update Status", "GetStatus", 
       new AjaxOptions { OnSuccess="replaceStatus" }) 
+0

बहुत अच्छा समाधान के onSuccess विकल्प में है कि फ़ंक्शन को कॉल करें। मैं कथन संदर्भकर्ता को बदलने का सुझाव दूंगा। LocalPath.Replace ("/", "% 2f") System.Web.HttpUtility.UrlEncode (referrer.PathAndQuery) के साथ अगर AJAX कार्रवाई तर्क भी लेती है। – tranmq

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