2011-01-25 33 views
18

Tôi muốn biết làm thế nào để tôi có thể chuyển hướng yêu cầu bên trong constructor điều khiển nếu tôi cần phải làm điều đó ?.MVC - Chuyển hướng bên trong Constructor

Ví dụ: Bên trong hàm tạo, tôi cần khởi tạo đối tượng có giá trị động, trong một số trường hợp tôi không muốn làm điều đó và trong trường hợp đó tôi muốn chuyển hướng đến một địa điểm khác. Theo cùng một cách, phần còn lại của hàm khởi tạo sẽ không được thực hiện cả "hành động gốc sau".

Tôi có thể làm như thế nào? Cảm ơn bạn

EDIT # 1

Ban đầu tôi đã sử dụng:

public override void OnActionExecuting(ActionExecutingContext filterContext) 

Ở đó tôi có thể chuyển hướng đến một số điều khiển khác/hành động/url, nhưng sau này trong thời gian, tôi cần phải thay đổi của tôi điều khiển, nơi tôi khởi tạo một biến trong hàm tạo của mình và có một số mã thực sự cần phải chuyển hướng yêu cầu: P

Tôi cần điều này cũng bởi vì OnActionExecuting thực thi SAU thứ e điều khiển constructor. Và trong logic của tôi, chuyển hướng cần được thực hiện ở đó.

Trả lời

45

Thực hiện chuyển hướng bên trong trình xây dựng bộ điều khiển không phải là thực tiễn tốt vì ngữ cảnh có thể không được khởi tạo. Thực hành tiêu chuẩn là viết thuộc tính hành động tùy chỉnh và ghi đè phương thức OnActionExecuting và thực hiện chuyển hướng bên trong. Ví dụ:

public class RedirectingActionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     if (someConditionIsMet) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
      { 
       controller = "someOther", 
       action = "someAction" 
      })); 
     } 
    } 
} 

và sau đó trang trí bộ điều khiển mà bạn muốn chuyển hướng với thuộc tính này. Hãy cực kỳ cẩn thận để không trang trí bộ điều khiển bạn đang chuyển hướng đến với thuộc tính này hoặc bạn sẽ chạy vào vòng lặp vô tận.

Vì vậy, bạn có thể:

[RedirectingAction] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // This action is never going to execute if the 
     // redirecting condition is met 
     return View(); 
    } 
} 

public class SomeOtherController : Controller 
{ 
    public ActionResult SomeAction() 
    { 
     return View(); 
    } 
} 
+0

bạn đánh bại tôi vào nó :). – bastijn

+0

cảm ơn bạn đã gợi ý, nhưng đó là những gì tôi đã sử dụng trước đây. kiểm tra EDIT # 1 – Dryadwoods

+0

@emanyalpsid, sau đó hãy để tôi đặt nó theo cách này: bạn không thể chuyển hướng bên trong bộ điều khiển bởi vì ngữ cảnh chưa được khởi tạo. Bạn có thể có thể làm điều này bên trong phương thức 'Initialize' nhưng IMHO bạn đang làm điều gì sai nếu bạn cần làm điều này. –

Các vấn đề liên quan