2012-01-19 22 views
8

Tôi có lỗi này:"hành động trẻ em không được phép để thực hiện chuyển hướng hành động"

Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'.

với ngoại lệ bên trong:

Child actions are not allowed to perform redirect actions.

Bất cứ ý tưởng tại sao điều này xảy ra?

Ngẫu nhiên, các lỗi đang xảy ra trên dòng này:

@Html.Action("Menu", "Navigation") 

Menu Action trong điều khiển Navigation trông như thế này:

public ActionResult Menu() 
{ 
    return PartialView(); 
} 
+0

Bạn có thể tìm câu hỏi này http://stackoverflow.com/questions/2056421/why-are-redirect-results-not -cho phép-trong-con-hành động-trong-asp-net-mvc-2 – Tassadaque

+6

Bao nhiêu lần bạn định hỏi điều này ngày hôm nay? Có thể trùng lặp của [Lỗi thực hiện yêu cầu con cho trình xử lý] (http://stackoverflow.com/questions/8924177/error-executing-child-request-for-handler) –

Trả lời

5

này không được phép vì MVC đã bắt đầu Rendering sự Xem đến trình duyệt (máy khách). Vì vậy, các khung MVC chặn điều này, bởi vì khách hàng đã nhận được dữ liệu (html). Miễn là quá trình hiển thị đang diễn ra, bạn không thể chuyển hướng trong chế độ xem con của bạn.

Thay vào đó, bạn có thể trả lại RedirectToAction.

+5

'Bạn có thể trả về RedirectToAction thay thế' ?? khó hiểu .. – dotNETbeginner

+0

Tôi đã thử rất nhiều giải pháp để có được một bộ lọc auth tùy chỉnh làm việc và cuối cùng đã tìm ra rằng quan điểm của tôi đã gọi '@ Html.Action()' thay vì '@ Url.Action()' sau này cung cấp cho bạn một url cho một liên kết và trước đó thực thi một hành động điều khiển để hiển thị nó. Rất bực bội, hãy chắc chắn rằng bạn không mắc lỗi này –

+0

Tôi đang sử dụng RedirectToAction trong bộ điều khiển của mình, nhưng nó vẫn cho tôi lỗi – Denny

9

Điều này xảy ra với tôi vì tôi có [RequireHttps] trên Controller và một hành động con được gọi từ một bộ điều khiển khác. Thuộc tính RequireHttps gây ra chuyển hướng

1

I had same situation like Doug described above

Giải pháp của tôi: 1) Tạo nhà máy điều khiển tùy chỉnh. Nó cần cho việc nhận ControllerContext trong thuộc tính https tùy chỉnh của tôi.

public class CustomControllerFactory : DefaultControllerFactory 
    { 
     public override IController CreateController(RequestContext requestContext, string controllerName) 
     { 
      var controller = base.CreateController(requestContext, controllerName); 
      HttpContext.Current.Items["controllerInstance"] = controller; 
      return controller; 
     } 
    } 
} 

2) Trong Application_Start hàm từ tập tin Global.asax viết tiếp theo:

ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory()); 

3) https tùy chỉnh Defined thuộc tính:

public class CustomRequireHttpsAttribute : System.Web.Mvc.RequireHttpsAttribute 
    { 
     public bool RequireSecure = false; 

     public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext) 
     { 

      if (RequireSecure && !((Controller)HttpContext.Current.Items["controllerInstance"]).ControllerContext.IsChildAction) 
      { 
       base.OnAuthorization(filterContext); 
      } 
     }   
    } 

4) Sử dụng thuộc tính mới cho định nghĩa về tài khoản bộ điều khiển: [CustomRequireHttps]

5

Thay vào đó o f

@Html.Action("Menu", "Navigation") 

Sử dụng

@Url.Action("Menu", "Navigation") 

Làm việc cho tôi :)

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