বেস কন্ট্রোলারে অন্যাকশনএক্সেকিউটিং থেকে কীভাবে পুনর্নির্দেশ করা যায়?


184

আমি দুটি উপায়ে চেষ্টা করেছি: রেসপন্স। রিডাইরেক্ট () যা কিছুই করে না, পাশাপাশি বেস কন্ট্রোলারের অভ্যন্তরে একটি নতুন পদ্ধতি কল করে যা একটি অ্যাকশন রেজাল্ট দেয় এবং এটি পুনর্নির্দেশনা-অক্ষর () ফিরিয়ে দেয় ... এই কাজের কোনওটাই নয়।

আমি কীভাবে অন্যাকশনএক্সেকিউটিং পদ্ধতি থেকে পুনর্নির্দেশ করতে পারি?

উত্তর:


362
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    ...
    if (needToRedirect)
    {
       ...
       filterContext.Result = new RedirectResult(url);
       return;
    }
    ...
 }

79
পরিবর্তে new RedirectResult(url)আপনি ব্যবহার করতে পারে new RedirectToAction(string action, string controller)। আপনি আপনার উত্তর পোস্ট করার পরে এটি এমভিসিতে যুক্ত করা যেতে পারে। আপনার সমাধান আমাকে যাইহোক ডান ট্র্যাকের উপর ফেলেছে।
মনফ্রেড

3
@ প্লুক - অন্যাকশনএক্সেকিউটিং প্রথমে ঘটে। যদি আপনি প্রসঙ্গটি সেট করেন es ফলাফল, পুনরায় পুনর্নির্দেশটি ক্রিয়াকলাপ সম্পাদনের আগে ঘটে। (ব্যক্তিগত পরীক্ষা / ডিবাগিং দ্বারা যাচাই করা হয়েছে))
জেমস

39
@ ম্যানফ্রেড নোট, অ্যাসাইনমেন্টটি পদ্ধতিতে (ছাড়াই new) পুনর্নির্দেশকরণের কাজটি করা উচিত :filterContext.Result = RedirectToAction(string action, string controller);
সিডারলফ

1
@ ম্যানফ্রেড আমি কেবল যুক্ত করতে চেয়েছিলাম যে আপনি পুনর্নির্দেশতন্ত্রটি নতুন করবেন না। এটি কেবলমাত্র ফিল্টারকন্টেক্সট. ফলাফল = পুনঃনির্দেশ টোঅ্যাকশন (..)
সিনায়েস্টিক

4
'রেডাইরেক্টটোএকশন' নামটি বর্তমান প্রসঙ্গে নেই ??
ড্যান হেস্টিংস


35

একটি পৃথক শ্রেণী তৈরি করুন,

    public class RedirectingAction : ActionFilterAttribute
    {
      public override void OnActionExecuting(ActionExecutingContext context)
      {
        base.OnActionExecuting(context);

        if (CheckUrCondition)
        {
            context.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "Home",
                action = "Index"
            }));
        }
      }
   }

তারপরে, আপনি যখন কোনও নিয়ামক তৈরি করেন, তখন এই টীকাকে কল করুন

[RedirectingAction]
public class TestController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

আমি কনস্ট্রাক্টরের পক্ষেRouteValueDictionary এই বেনামে থাকা বিষয়টিকে পছন্দ করি কারণ এটি এমভিসির অন্য কোথাও রাউটিংয়ের মিরর। +1
কোডিং হয়ে গেছে

3

পুনঃনির্দেশিত নিয়ামক যদি একই পদ্ধতি থেকে উত্তরাধিকারী হয় তবে baseControllerআমরা OnActionExecutingপদ্ধতিটি পুনরাবৃত্ত লুপকে ওভাররাইড করি । ধরুন আমরা অ্যাকাউন্ট কন্ট্রোলারের লগইন অ্যাকশনে এটি পুনর্নির্দেশ করি, তারপরে লগইন ক্রিয়াটি কল করুন OnActionExecutingএবং একই লগইন অ্যাকশনে বারবার পুনঃনির্দেশিত হবে ... সুতরাং OnActionExecutingআবহাওয়া যাচাই করার জন্য আমাদের পদ্ধতিটিতে একটি চেক প্রয়োগ করা উচিত অনুরোধটি একই নিয়ামকের পক্ষ থেকে যদি হয় সুতরাং এটি আবার লগইন ক্রিয়া পুনর্নির্দেশ করবেন না। কোডটি এখানে:

সুরক্ষিত ওভাররাইড

void OnActionExecuting(ActionExecutingContext filterContext)
{
   try
   {
      some condition ...
   }
   catch
   {
      if (filterContext.Controller.GetType() !=     typeof(AccountController))
      {
         filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } });
      }
   }
}

1
চেষ্টা করুন Company int কোম্পানীআইডি = ইউজারকন্টেক্সট.কম্পানি.কম্প্যানিআইডি; } ক্যাপচার (if (ফিল্টারকন্টেক্সট.কন্ট্রোলার.গেটটাইপ ()! = টাইপফ (অ্যাকাউন্টকন্ট্রোলার)) {ফিল্টারকন্টেক্সট.সেসাল্ট = নতুন রিডাইরেক্টটোরআউটরেসাল্ট (নতুন রুটভ্যালিউডিয়েটারিয়ান {control "নিয়ামক", "অ্যাকাউন্ট"}, {"ক্রিয়া", "লগইন"} ); }}
আবদুলুল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.