2009-02-15 8 views
71

RedirectToAction संरक्षित है, और हम इसे केवल क्रियाओं के भीतर उपयोग कर सकते हैं। लेकिन अगर मैं एक फिल्टर में रीडायरेक्ट करना चाहता हूं?फ़िल्टर को अन्य कार्यवाही पर रीडायरेक्ट करने के लिए कैसे प्राप्त करें?

public class IsGuestAttribute: ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!Ctx.User.IsGuest) 
      filterContext.Result = (filterContext.Controller as Controller) 
       .RedirectToAction("Index", "Home"); 
    } 
} 

उत्तर

92

RedirectToAction, एक RedirectToRouteResult() निर्माण करने के लिए सिर्फ एक सहायक विधि है तो क्या आप एक नई RedirectToRouteResult() आपके कार्य के लिए मूल्यों के साथ एक RouteValueDictionary() साथ गुजर बनाने जा सके।

पूरा नीचे टिप्पणी में @Domenic से कोड के आधार पर नमूना:

public class IsGuestAttribute: ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!Ctx.User.IsGuest) 
     { 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
       { 
        { "controller", "Home" }, 
        { "action", "Index" } 
       }); 
     } 
    } 
} 
+1

आप इस कोड को 'ऑनएक्सप्शन' विधि में भी डाल सकते हैं, जब तक आप 'filterContext.ExceptionHandled = true; ' – demoncodemonkey

87

यहाँ एक कोड उदाहरण है:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 

    if (!Ctx.User.IsGuest) 
    { 
     RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary(); 
     redirectTargetDictionary.Add("action", "Index"); 
     redirectTargetDictionary.Add("controller", "Home"); 

     filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary); 
    } 
} 
+15

सेट करें या केवल' नया रीडायरेक्ट ToRouteResult (नया रूट ValueDictionary {{" नियंत्रक "," होम "}, { "एक्शन", "होमपेज"}}) ' – Domenic

+13

यदि आप केवल हरे रंग के रिशेपर अंडरलाइन – CRice

+1

के साथ टिप्पणी कर सकते थे तो आप इस कोड को 'ऑनएक्सप्शन' विधि में भी डाल सकते हैं, जब तक आप 'filterContext.ExceptionHandled = true सेट करते हैं ; ' – demoncodemonkey

0

सुरक्षा/प्राधिकरण/प्रमाणीकरण फिल्टर AuthorizeAttribute और IAuthorizationFilter उपयोग करना चाहिए।

public class IsGuestAttribute: AuthorizeAttribute, IAuthorizationFilter 
{ 
    public void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
    } 
    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!Ctx.User.IsGuest) 
     { 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
       { 
        { "controller", "Home" }, 
        { "action", "Index" } 
       }); 
     } 
    } 
} 
1

मुझे पता है कि मैं पार्टी के लिए देर से एक छोटा सा हूँ, लेकिन मैं veggerby के समाधान के लिए इस्तेमाल किया और एक सहायक वर्ग है कि कुछ लोगों के लिए उपयोगी हो सकता है बनाया गया है, इसलिए मैं यहाँ यह देना चाहते थे:

public static class ActionFilterHelpers 
{ 
    public static void Redirect(this ActionExecutingContext filterContext, String controller, String action, object routeValues) 
    { 
     filterContext.Result = Redirect(controller, action, routeValues); 
    } 

    public static ActionResult Redirect(String controller, String action, object routeValues) 
    { 
     var routeValues = new RouteValueDictionary(); 

     routeValues["controller"] = controller; 
     routeValues["action"] = action; 

     foreach (var keyValue in new ObjectDictionary(routeValues)) 
      routeValues.Add(keyValue.Key, keyValue.Value); 

     return new RedirectToRouteResult(routeValues); 
    } 
} 

मैंने एक स्थैतिक विधि प्रदान की जो एक रीडायरेक्ट ActionResult और एक विस्तार विधि देता है जो filterContext तक फैलाता है। आशा है कि किसी को यह उपयोगी लगेगा।

ObjectDictionary एक ऐसी कक्षा है जो उस वस्तु के गुणों से शब्दकोश बनाने के लिए प्रतिबिंब का उपयोग करती है, जिससे इसे बनाया गया है। मैंने उस कोड को शामिल नहीं किया क्योंकि मेरा मानना ​​है कि ढांचे में कहीं ऐसा करने का एक बेहतर तरीका है। मुझे अभी तक यह नहीं मिला है, लेकिन मैं नहीं चाहता कि दूसरों को मेरी संभावित बग का वारिस प्राप्त हो।

0

उपयोग:filterContext.RedirectToAction("Login", "Account");

यहाँ एक सहायक वर्ग मैं कुछ विस्तार और अधिक स्थानों में RedirectToAction सुविधा प्रदान करने के प्रश्न के लिखित तरीकों के साथ लिखा है। ओपी के लिए यह बहुत देर हो चुकी है लेकिन उम्मीद है कि यह किसी की मदद करेगी!

public static class RedirectHelper 
{ 
    // RedirectToAction Extension Methods 
    public static void RedirectToAction(this HttpResponseBase response, String action, String controller, object routeValues = null, bool endResponse = false) 
    { 
     response.RedirectToRoute(CreateRoute(action, controller, routeValues)); 
     if (endResponse) response.End(); 
    } 
    public static void RedirectToAction(this HttpResponse response, String action, String controller, object routeValues = null, bool endResponse = false) 
    { 
     response.RedirectToRoute(CreateRoute(action, controller, routeValues)); 
     if (endResponse) response.End(); 
    } 
    public static void RedirectToAction(this ActionExecutingContext filterContext, String action, String controller, object routeValues = null, bool endResponse = false) 
    { 
     if (endResponse) filterContext.HttpContext.Response.RedirectToAction(action, controller, routeValues, true); 
     else filterContext.Result = new RedirectToRouteResult(CreateRoute(action, controller, routeValues)); 
    } 
    public static void RedirectToAction(this ExceptionContext filterContext, String action, String controller, object routeValues = null, bool endResponse = false) 
    { 
     if (endResponse) filterContext.HttpContext.Response.RedirectToAction(action, controller, routeValues, true); 
     else { 
      filterContext.ExceptionHandled = true; 
      filterContext.Result = new RedirectToRouteResult(CreateRoute(action, controller, routeValues)); 
     } 
    } 
    // Route Value Derivation 
    public static RouteValueDictionary CreateRoute(String action, String controller, object routeValues = null) 
    { 
     RouteValueDictionary result = routeValues != null ? 
      HtmlHelper.AnonymousObjectToHtmlAttributes(routeValues) : 
      new RouteValueDictionary(); 
     result["controller"] = controller; 
     result["action"] = action; 
     return result; 
    } 
} 

अधिक नियंत्रक कॉन्टैक्स हैं जो शामिल नहीं हैं लेकिन आपकी आवश्यकताओं के आधार पर इसे स्वयं जोड़ना काफी आसान होना चाहिए।

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

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