Bộ điều khiển cho đường dẫn không được tìm thấy hoặc không triển khai IController


79

Tôi có một dự án MVC4 với lựa chọn ngôn ngữ:

  • en
  • nl
  • fr
  • de

1 phần chính với:

  • Trong khoảng
  • Chung (cho menu)
  • Tiếp xúc
  • FAQ
  • Trang Chủ

Và 3 lĩnh vực:

  • quản trị viên
  • Khách hàng
  • cửa tiệm

Trong mỗi khu vực, tôi có ít nhất một bộ điều khiển, ví dụ: trong Quản trị, tôi có tổng quan bộ điều khiển với tổng quan thư mục dạng xem tương ứng có chứa trang index.aspx .

Trang chủ và tất cả các trang chính (về, câu hỏi thường gặp, v.v.) hoạt động và có thể được truy cập).

Tuy nhiên, khi tôi theo dõi url: localhost: xxxx / en / admin / general, tôi gặp lỗi:

Không tìm thấy bộ điều khiển cho đường dẫn '/ en / admin / Overview' hoặc không triển khai IController.

Mặc dù tuyến đường là chính xác (tôi có thể thấy điều này với Trình gỡ lỗi tuyến đường), trang lỗi cũng cho thấy lỗi đã được tạo ra khi tôi muốn tải các mục menu chính của mình:

<nav id="site-navigation" class="eightcol">
    @Html.Action("MenuItems", "Common")
</nav>

- Mã bị xóa vì không liên quan -

Mọi thứ dường như theo thứ tự, nhưng MVC dường như không thể tải menu, nằm ở phần chính.

Vì vậy, gốc rễ của vấn đề là: Tôi có thể cấp quyền truy cập khu vực (ví dụ: Quản trị) cho các bộ điều khiển trong phần chính (nhà, chung, khoảng, v.v.) của dự án của tôi không?


Bạn đã thử nhận xét cuộc gọi tới Html. Hành động để tách sự cố với bộ điều khiển cụ thể chưa?
Jonas Høgh 23/12/12

Tôi vẫn chưa làm, nhưng bây giờ tôi đã làm và nó như tôi nghĩ. Quản trị viên Khu vực sử dụng bố cục từ phần chính của dự án của tôi và khi nó đến Hành động, khu vực sẽ cố gắng truy cập bộ điều khiển không nằm trong khu vực gây ra lỗi. Nói cách khác, gốc rễ của vấn đề là, làm cách nào tôi có thể cấp quyền truy cập khu vực cho các bộ điều khiển trong phần chính (bộ điều khiển home, common, about, v.v.) của dự án của tôi?
reaper_unique 23/12/12

2
Câu hỏi ngày càng có nhiều vấn đề và giải pháp có thể xảy ra. Vì vậy, tôi nghĩ, cần phải xem xét các câu trả lời khác và không phải câu trả lời duy nhất được chấp nhận.
Alireza

Câu trả lời:


121

Tôi đã tìm thấy nó.

Khi một trang, nằm bên trong một khu vực, muốn truy cập bộ điều khiển nằm bên ngoài khu vực này (chẳng hạn như trang bố cục được chia sẻ hoặc một trang nhất định bên trong một khu vực khác), khu vực của bộ điều khiển này cần được thêm vào. Vì bộ điều khiển chung không nằm trong một khu vực cụ thể mà là một phần của dự án chính, bạn phải để trống khu vực:

@Html.Action("MenuItems", "Common", new {area="" }) 

Phần trên cần được thêm vào tất cả các hành động và liên kết hành động vì trang bố cục được chia sẻ trên khắp các lĩnh vực khác nhau.

Nó chính xác là vấn đề giống như ở đây: Các khu vực ASP.NET MVC với bố cục được chia sẻ

Chỉnh sửa : Nói rõ hơn, đây được đánh dấu là câu trả lời vì nó là câu trả lời cho vấn đề của tôi. Các câu trả lời trên có thể giải quyết các nguyên nhân gây ra lỗi tương tự.


11
Cảm ơn, điều đó đã làm việc cho tôi. Đó là một thông báo lỗi rất dễ gây hiểu lầm từ .NET nói rằng không thể tìm thấy bộ điều khiển cho hành động trong khu vực, điều này hoàn toàn không đúng!
Richard Fawcett

1
Điều này đã khắc phục sự cố của tôi. Tôi đoán lần tới tôi nên bắt đầu với câu trả lời bằng dấu kiểm màu xanh lá cây thay vì ở đầu danh sách.
Cameron Belt,

'@ Html.Action ("Giới thiệu", "Trang chủ", mới {area = ""})' gây ra lỗi biên dịch khi chỉ định nó là vùng trống. Bất kỳ đề xuất ?
Thamarai T

16

Trong trường hợp của tôi, lỗi tương tự không liên quan đến Khu vực nhưng được cho là đăng lỗi gây ra trong trường hợp của tôi, điều này có thể hữu ích cho những người đến chuỗi này bằng cách tìm kiếm "Bộ điều khiển cho đường dẫn không được tìm thấy hoặc không triển khai IController "

Lỗi xảy ra do nhập sai trong tệp _Layout.cshtml.

@Styles.Render("~/Content/misc")

Gói có tên đó đã bị xóa trong BundleConfig.cs nhưng lại quên xóa trong _Layout.cshtml

Thật là ngớ ngẩn, nhưng các lập trình viên của chúng ta luôn mắc rất nhiều lỗi ngớ ngẩn :)


1
Cảm ơn vì giải pháp. Thực sự là có thể có nhiều giải pháp cho một vấn đề dường như giống hệt nhau nhưng về mặt thực tế thì chỉ có một vấn đề tương tự. Tuy nhiên, như câu hỏi của tôi đã nêu rằng tôi sử dụng các khu vực giải pháp mà tôi đã chọn vẫn là chính xác nhất.
reaper_unique

15

Ngoài ra, đối với những người giải pháp trên không hoạt động, đây là những gì đã làm việc cho tôi:

Tôi có một giải pháp với nhiều dự án. Tất cả các dự án đều nằm trong MVC3. Tôi đã cài đặt Visual Studio 2012 trong máy của mình và có vẻ như một số dự án đã được tự động nâng cấp lên MVC4.

Tôi có vấn đề này

Bộ điều khiển cho đường dẫn '/ etc / etc' không được tìm thấy hoặc không triển khai IController

bởi vì dự án xử lý tuyến đường đó đã trỏ đến MVC4.

Tôi đã phải cập nhật thủ công các tham chiếu của họ để sử dụng MVC3. Bạn cũng có thể làm điều đó bằng cách mở tệp .csproj bằng trình soạn thảo văn bản. Tìm tham chiếu đến MVC3 và xóa dòng này:

<SpecificVersion>False</SpecificVersion>

2
Ôi trời ơi. Thật là ngẫu nhiên và mờ mịt. Cảm ơn rất nhiều cho bài viết! :) NGƯỜI ĐỌC TƯƠNG LAI: Của tôi chỉ khác một chút - bản dll là 4.0 thay vì 3.0 - không chắc nó đã thay đổi như thế nào.
Jared

Vấn đề với tôi cũng tương tự; Tôi có một thư viện được chia sẻ được tham chiếu bởi lớp bản trình bày và chứa bộ điều khiển được chia sẻ và thư viện được chia sẻ đang sử dụng mvc4, trong khi lớp bản trình bày đang sử dụng mvc3. Sau khi tôi cập nhật thư viện được chia sẻ lên MVC3, nó đã giải quyết được sự cố.
jbooker

13

Tuy nhiên, một nguyên nhân gốc rễ khác có thể xảy ra cho lỗi này là nếu không gian tên cho lớp đăng ký vùng không khớp với không gian tên cho bộ điều khiển.

Ví dụ: đặt tên đúng trên lớp bộ điều khiển:

namespace MySystem.Areas.Customers
{
    public class CustomersController : Controller
    {
        ...
    }
}

Với việc đặt tên sai trên lớp đăng ký khu vực:

namespace MySystem.Areas.Shop
{
    public class CustomersAreaRegistration : AreaRegistration
    {
        ...
    }
}

(Không gian tên ở trên phải là MySystem.Areas.Customers.)

Liệu tôi có bao giờ học cách ngừng sao chép và dán mã không? Chắc là không.


2
Điều này làm tôi ngạc nhiên và khó tìm thấy vì không gian tên bị sai khi nó nằm trong thư mục bộ điều khiển gốc (mã được sao chép từ một dự án khác), nhưng nó không thành vấn đề trước khi tôi chuyển nó đến một khu vực.
Richard Garside

12

Lỗi này cũng có thể do thực tế là Bộ điều khiển phải có (trong tên của họ) từ Controller; viz:HomeController ; trừ khi bạn thực hiện của riêng bạn ControllerFactory.


2
Đây là sai lầm của tôi. Cảm ơn George!
Wilky

Tôi đã có vấn đề này. Đó là vì tôi đã xóa tệp HomeController.cs của mình và tôi không hiểu điều gì phụ thuộc vào nó.
user2023861

Bạn là giám đốc điều hành
Denys Wessels

12

trong trường hợp của tôi, vấn đề là lớp điều khiển đã không được thông báo công khai.

class WorkPlaceController : Controller

giải pháp là

public class WorkPlaceController : Controller

7

Trong trường hợp của tôi, namespacestham số không khớp với không gian tên của bộ điều khiển.

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new {controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new[] { "Web.Areas.Admin.Controllers" }
    );
}

6

Đây là vấn đề của tôi và giải pháp phù hợp với tôi.

Tôi đã thêm bộ điều khiển mới với một hành động duy nhất trả lại một chuỗi cho ứng dụng hiện có. Nhưng khi tôi điều hướng đến bộ điều khiển đó qua trình duyệt, tôi gặp lỗi tương tự như đã đề cập ở trên.

Sau khi thực hiện rất nhiều googling, tôi phát hiện ra rằng tôi chỉ cần sửa đổi tệp Global.asax.cs của mình để nó nhận ra bộ điều khiển mới. Tất cả những gì tôi đã làm là thêm một khoảng trống vào tệp Global.asax.cs để nó được sửa đổi và hoạt động


Chúng tôi có 3 máy chủ web sản xuất và 5 máy phát triển / thử nghiệm. Chỉ trên một máy sản xuất là nó không hoạt động. Thêm một không gian và lưu Global.asax đã sửa nó. #mindblown
jbwebtech

5

Không chắc liệu điều này có đưa ra giải pháp từ một góc độ khác với câu trả lời được chấp nhận hay không, nhưng tôi thấy rằng một trong những bộ điều khiển của tôi trong phần Khu vực đang ở trong không gian tên sai. Sửa không gian tên thành:

Areas.{AreaName}.Controller

đã khắc phục sự cố cho tôi.

Tôi nghi ngờ yếu tố quan trọng là có tất cả các bộ điều khiển trong một khu vực nhất định chia sẻ cùng một không gian tên.


Chúc bạn có thể yêu thích câu trả lời chứ không chỉ câu hỏi. Tôi đã lặp lại câu trả lời này rất nhiều lần. Nó rất hữu ích, cảm ơn.
Shelby115

5

Một nguyên nhân khác gây ra lỗi này: Tình cờ sử dụng Html.Action trong tệp Bố cục trong đó Html.ActionLink có thể đã được dự định. Nếu dạng xem được Html.Action tham chiếu sử dụng cùng một tệp Bố cục thì bạn đã tạo một vòng lặp vô tận. (Chế độ xem bố trí tải chế độ xem được tham chiếu dưới dạng chế độ xem một phần, sau đó tải chế độ xem bố trí tải chế độ xem được tham chiếu ...) Nếu bạn đặt một điểm ngắt trong tệp Bố cục và thực hiện một bước qua Htlm. Đôi khi bạn sẽ nhận được một hành động hữu ích hơn thông báo về kích thước ngăn xếp quá mức.


5

Trong trường hợp của tôi, tôi đã có @{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); }trong _Layout.cshtml nhưng LayoutController không tồn tại! (Tôi đã sao chép _Layout.cshtml từ một giải pháp khác nhưng quên sao chép bộ điều khiển)


4

Trong trường hợp của tôi trong phương thức global.asax / application_start, tôi đã đăng ký các tuyến api web SAU các tuyến mvc như vậy:

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);

Hoàn nguyên đơn đặt hàng đã khắc phục sự cố

GlobalConfiguration.Configure(WebApiConfig.Register);            
RouteConfig.RegisterRoutes(RouteTable.Routes);

2

Nếu phù hợp với thiết kế của bạn, bạn có thể đảm bảo rằng công cụ sửa đổi quyền truy cập trên lớp bộ điều khiển của bạn là 'công khai', không phải thứ có thể hạn chế quyền truy cập như 'nội bộ' hoặc 'riêng tư'.


2

Thật đáng xấu hổ, vấn đề trong trường hợp của tôi là tôi chưa xây dựng lại mã sau khi thêm bộ điều khiển .

Vì vậy, có thể điều đầu tiên cần kiểm tra là bộ điều khiển của bạn đã được xây dựng và hiện diện (và công khai) trong các tệp nhị phân hay chưa. Nó có thể giúp bạn tiết kiệm vài phút gỡ lỗi nếu bạn giống tôi.


1
Tất nhiên đó là vấn đề của tôi ... Đó luôn là những điều ngu ngốc khiến bạn gặp phải.
TJ Wolschon

2

Điều này có thể là do đường dẫn đã sai. Vì vậy, hãy kiểm tra đường dẫn và chính tả của bộ điều khiển trước. Trong trường hợp của tôi, bộ điều khiển của tôi được đặt tên là CampsController và tệp WebApiConfig.cs có thêm một đường dẫn trong đó.

Thay vì: http: // localhost: 6600 / Camps

Đó là: http: // localhost: 6600 / api / Camps

Tôi đã không nhận thấy từ api trong tệp WebApiConfig.cs:

config.Routes.MapHttpRoute(
          name: "DefaultApi",
          routeTemplate: "api/{controller}/{id}",
          defaults: new { id = RouteParameter.Optional }
      );

Ngoài ra, nó có thể là do bộ điều khiển được đặt tên không chính xác. Ở đây tôi đã gọi là LayoutController, nhưng đáng lẽ phải gọi là Layout:

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "LayoutController" })</a>

nên là:

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "Layout")</a>

Một ví dụ khác, đó có thể là do bạn xác định đường dẫn Tuyến sai. Đảm bảo rằng đường dẫn của bạn là chính xác. Thí dụ:

   [RoutePrefix("api/camps")]
   public class CampsController : ApiController

   [Route("{moniker}")]
   public async Task<IHttpActionResult> Get(string moniker)

1

Trong một kịch bản khác mà tôi muốn bổ sung là Trong kịch bản của tôi, không gian tên khác nhau đối với bộ điều khiển vì đó là lỗi sao chép bộ điều khiển từ một dự án khác.


1

Trong trường hợp ứng dụng cũ của tôi, sự cố đã xảy ra khi tôi thêm mục nhập bên dưới vào tệp web.config dưới nút <system.webServer>

       <modules runAllManagedModulesForAllRequests="true"></modules>

Khi tôi xóa nó, sự cố đã được giải quyết.


1

Sự cố này cũng xảy ra nếu bạn không bao gồm lớp bộ điều khiển của mình cho quá trình biên dịch trong tệp .csproj.

<Compile Include="YOUR_CONTROLLER_PATH.cs" />

1

Dựa trên câu trả lời này của George, tôi nhận thấy trong trường hợp của mình rằng tôi đã thiết lập bộ điều khiển của mình đúng cách ThingControllervà tôi đã có một phương pháp được xác định đúng trên bộ điều khiển đó Edit.

Nhưng .. tôi đã tham khảo nó theo quan điểm của tôi với

<a href="https://stackoverflow.com/App/ThingController/Edit" />

Nơi tôi lẽ ra chỉ sử dụng tên mà không có bộ điều khiển từ như

<a href="https://stackoverflow.com/App/Thing/Edit" />


1

Trong trường hợp của tôi, tôi đang hiển thị một phương thức hành động khác cho phần menu của mình trong tệp _layout.cshtml bằng cách sử dụng @ Html.Action ("Menu", "Menu") trong khi tôi quên tạo bộ điều khiển Menu và tệp bố cục đang được sử dụng trong tệp hiện tại của tôi chế độ xem hành động của bộ điều khiển, do đó tôi gặp lỗi này trong yêu cầu kết xuất hành động hiện tại của mình. cố gắng xem trong bố cục của bạn và cũng như xem tệp nếu bạn cũng mắc lỗi tương tự

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.