2013-04-10 38 views
5

Tôi có một trang web trong MVC4 sử dụng các khu vực. Trong một số khu vực (cho phép gọi nó Area), tôi có một bộ điều khiển (Controller) với hành động này:Bộ điều khiển MVC.Thực hiện với các khu vực

public ActionResult Index() 
{ 
    return View(); 
} 

public ActionResult OtherAction() 
{ 
    return View("Index"); 
} 

này hoạt động tuyệt vời nếu tôi thực hiện một chuyển hướng đơn giản để Area/Controller/OtherAction như thế này:

return RedirectToAction("OtherAction", "Controller", new { area = "Area" }); 

Nhưng tôi cần (check here why) để thực hiện một chuyển hướng như thế này:

RouteData routeData = new RouteData(); 
routeData.Values.Add("area", "Area"); 
routeData.Values.Add("controller", "Controller"); 
routeData.Values.Add("action", "OtherAction"); 
ControllerController controller = new ControllerController(); 
controller.Execute(new RequestContext(new HttpContextWrapper(HttpContext.ApplicationInstance.Context), routeData)); 

Và trong trường hợp đó nó không hoạt động. Sau khi dòng cuối cùng, phương pháp OtherAction được thực hiện và sau đó trong dòng cuối cùng của mã này nó ném ngoại lệ này:

Quan điểm 'Index' hoặc thạc sĩ của nó đã không tìm thấy hoặc không có công cụ xem hỗ trợ các địa điểm đã tìm kiếm . Các vị trí sau được tìm kiếm:

~/Views/Controller/index.aspx

~/Views/Controller/Index.ascx

~/Views/Shared/index.aspx

~/Views/Shared/Index.ascx

~/Views/Controller/Index.cshtml

~/Views/Controller/Index.vbhtml

~/Views/Shared/Index.cshtml

~/Views/Shared/Index.vbhtml

Tại sao điều này xảy ra và làm thế nào tôi có thể sửa chữa nó?

Trả lời

9

Bạn nhận ngoại lệ vì ASP.NET MVC cố gắng tìm kiếm chế độ xem của bạn trong ngữ cảnh "gốc" và không nằm trong thư mục xem khu vực vì bạn không thiết lập đúng vùng trong routeData.

Các area nhu cầu quan trọng được đặt trong DataTokens bộ sưu tập và không có trong Values

RouteData routeData = new RouteData(); 
routeData.DataTokens.Add("area", "Area"); 
routeData.Values.Add("controller", "Controller"); 
routeData.Values.Add("action", "OtherAction"); 
//...