2009-09-29 10 views
39

मैंने एक एक्शन फ़िल्टर लिखा है जो एक नए सत्र का पता लगाता है और उपयोगकर्ता को एक पृष्ठ पर रीडायरेक्ट करने का प्रयास करता है जो यह बताता है कि यह हुआ है। एकमात्र समस्या यह है कि मैं यह नहीं समझ सकता कि इसे एक एक्शन फ़िल्टर में नियंत्रक/एक्शन कॉम्बो पर रीडायरेक्ट कैसे किया जाए। मैं इसके बजाय केवल एक निर्दिष्ट यूआरएल पर रीडायरेक्ट करने का तरीका समझ सकता हूं। क्या mvc2 में एक्शन फ़िल्टर में नियंत्रक/एक्शन कॉम्बो पर रीडायरेक्ट करने का कोई सीधा तरीका है?एएसपीनेट एमवीसी एक्शन फ़िल्टर में निर्दिष्ट नियंत्रक और एक्शन में रीडायरेक्टिंग

उत्तर

87

बल्कि HttpContent के लिए एक संदर्भ हो रही है और ActionFilter में सीधे पुनः निर्देशित से आप फिल्टर संदर्भ का परिणाम सेट एक RedirectToRouteResult हो सकता है। यह थोड़ा क्लीनर और परीक्षण के लिए बेहतर है।

इस तरह

:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if(something) 
    { 
     filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary {{ "Controller", "YourController" }, 
             { "Action", "YourAction" } }); 
    } 

    base.OnActionExecuting(filterContext); 
} 
+1

मेरा सिर दर्द कर रहा था, अब यह नहीं है। धन्यवाद – jolySoft

+3

यह मेरे मुकाबले ज्यादा उचित उत्तर है। एमवीसी पर यह मेरा पहला सवाल था और आज मैं इसका उत्तर दूंगा। –

4

कॉल RedirectToActionthis overload का उपयोग कर:

protected internal RedirectToRouteResult RedirectToAction(
    string actionName, 
    RouteValueDictionary routeValues 
) 

कार्रवाई फिल्टर में, कहानी एक छोटे से अलग है। एक अच्छा उदाहरण के लिए, यहाँ देखें:

http://www.dotnetspider.com/resources/29440-ASP-NET-MVC-Action-filters.aspx

+0

एक अच्छी जगह एक कार्रवाई फिल्टर (+1) में पुनः निर्देशित देखने के लिए है, लेकिन मैं वास्तव में मेरे फिल्टर करने के लिए नियंत्रक/कार्रवाई कॉम्बो निर्दिष्ट चाहते हैं। मैं कस्टम रूटिंग के मामले में केवल तारों को जोड़ना नहीं चाहता था, लेकिन मैं कुछ ऐसा ढूंढ रहा था जो मदद कर सके। मेरा जवाब देखें –

17

संपादित करें: मूल सवाल यह है कि सत्र लॉगआउट स्वचालित रूप से पता लगाने के लिए, और फिर पुन: निर्देशित एक निर्दिष्ट नियंत्रक और कार्रवाई करने के बारे में था। हालांकि यह सवाल अधिक उपयोगी साबित हुआ क्योंकि यह वर्तमान रूप है।


मैं इस लक्ष्य को प्राप्त करने के लिए आइटम के संयोजन का उपयोग समाप्त हो गया।

पहला सत्र समाप्ति फ़िल्टर here पाया गया है। फिर मैं एक रीडायरेक्ट यूआरएल प्राप्त करने के लिए नियंत्रक/एक्शन कॉम्बो निर्दिष्ट करने के लिए कुछ चाहता था, जिसे मुझे here के कई उदाहरण मिले। अंत में मैं इस के साथ आया था:

public class SessionExpireFilterAttribute : ActionFilterAttribute 
{ 
    public String RedirectController { get; set; } 
    public String RedirectAction { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpContext ctx = HttpContext.Current; 

     if (ctx.Session != null) 
     { 
      if (ctx.Session.IsNewSession) 
      { 
       string sessionCookie = ctx.Request.Headers["Cookie"]; 
       if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 
        UrlHelper helper = new UrlHelper(filterContext.RequestContext); 
        String url = helper.Action(this.RedirectAction, this.RedirectController); 
        ctx.Response.Redirect(url); 
       } 
      } 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 
+7

यदि आप इसे और अधिक टेस्टेबल बनाना चाहते हैं, तो मेरा मानना ​​है कि आप स्पष्ट रूप से पुनर्निर्देशित करने के बजाय, फ़िल्टरकॉन्टेक्स्ट को रीडायरेक्ट रीसेट पर सेट कर सकते हैं। शुद्ध परिणाम यह है कि एमवीसी अभी भी रीडायरेक्ट करेगा, लेकिन इस तरह आप यूनिट परीक्षण लिख सकते हैं जो मैन्युअल रूप से OnActionExecuting() का आह्वान करता है और फिर filterContext.Result के खिलाफ जोर देता है। –

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