วิธีการเปลี่ยนเส้นทางจาก OnActionExecuting ใน Base Controller?


185

ฉันได้ลองสองวิธี: Response.Redirect () ซึ่งไม่ทำอะไรเลยรวมถึงการเรียกใช้วิธีการใหม่ภายใน Base Controller ที่ส่งคืน ActionResult และให้มันคืน RedirectToAction () ... ไม่ทำงานเหล่านี้

ฉันจะเปลี่ยนเส้นทางจากวิธี OnActionExecuting ได้อย่างไร

คำตอบ:


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

79
แทนการที่คุณยังสามารถใช้new RedirectResult(url) new RedirectToAction(string action, string controller)สิ่งนี้อาจถูกเพิ่มไปยัง MVC หลังจากที่คุณโพสต์คำตอบของคุณ ทางออกของคุณทำให้ฉันก้าวไปในทิศทางที่ถูกต้องอยู่ดี
Manfred

3
@Pluc - OnActionExecuting เกิดขึ้นก่อน หากคุณตั้งค่าบริบทผลการเปลี่ยนเส้นทางจะเกิดขึ้นก่อนที่การกระทำจะดำเนินการ (ตรวจสอบโดยการทดสอบ / แก้ไขข้อบกพร่องส่วนบุคคล)
James

39
@Manfred หมายเหตุการมอบหมายควรทำกับวิธีการ (โดยไม่ต้องnew) RedirectToAction:filterContext.Result = RedirectToAction(string action, string controller);
cederlof

1
@ Manfred ฉันแค่อยากจะเพิ่มว่าคุณจะไม่ใหม่ RedirectToAction มันเป็นเพียง filterContext.Result = RedirectToAction (.. )
Sinaesthetic

4
ชื่อ 'RedirectToAction' ไม่มีอยู่ในบริบทปัจจุบันหรือไม่?
Dan Hastings


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นี้สำหรับตัวสร้างเนื่องจากเป็นตัวกำหนดเส้นทางที่อื่นใน MVC +1
Gone Coding

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
ลอง {int CompanyId = UserContext.Company.CompanyId; } catch {if (filterContext.Controller.GetType ()! = typeof (AccountController)) {filterContext.Result = ใหม่ RedirectToRouteResult (ใหม่ RouteValueDictionary {{"ตัวควบคุม", "บัญชี", "เข้าสู่ระบบ"}, ); }}
อับดุลอับอาย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.