ฉันได้ลองสองวิธี: Response.Redirect () ซึ่งไม่ทำอะไรเลยรวมถึงการเรียกใช้วิธีการใหม่ภายใน Base Controller ที่ส่งคืน ActionResult และให้มันคืน RedirectToAction () ... ไม่ทำงานเหล่านี้
ฉันจะเปลี่ยนเส้นทางจากวิธี OnActionExecuting ได้อย่างไร
ฉันได้ลองสองวิธี: Response.Redirect () ซึ่งไม่ทำอะไรเลยรวมถึงการเรียกใช้วิธีการใหม่ภายใน Base Controller ที่ส่งคืน ActionResult และให้มันคืน RedirectToAction () ... ไม่ทำงานเหล่านี้
ฉันจะเปลี่ยนเส้นทางจากวิธี OnActionExecuting ได้อย่างไร
คำตอบ:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
if (needToRedirect)
{
...
filterContext.Result = new RedirectResult(url);
return;
}
...
}
new
) RedirectToAction:filterContext.Result = RedirectToAction(string action, string controller);
มันสามารถทำได้ด้วยวิธีนี้เช่นกัน:
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{"controller", "Home"},
{"action", "Index"}
}
);
สร้างคลาสแยกต่างหาก
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
หากตัวควบคุมที่เปลี่ยนเส้นทางสืบทอดมาจากที่เดียวกับ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" } });
}
}
}
new RedirectResult(url)
new RedirectToAction(string action, string controller)
สิ่งนี้อาจถูกเพิ่มไปยัง MVC หลังจากที่คุณโพสต์คำตอบของคุณ ทางออกของคุณทำให้ฉันก้าวไปในทิศทางที่ถูกต้องอยู่ดี