Gặp sự cố với nhiều bộ điều khiển có cùng tên trong dự án của tôi


96

Tôi đang gặp lỗi sau với dự án ASP.NET MVC 3 của mình:

Nhiều loại đã được tìm thấy phù hợp với bộ điều khiển có tên 'Nhà'. Điều này có thể xảy ra nếu tuyến cung cấp yêu cầu này ('Home / {action} / {id}') không chỉ định không gian tên để tìm kiếm bộ điều khiển phù hợp với yêu cầu. Nếu đúng như vậy, hãy đăng ký tuyến đường này bằng cách gọi quá tải phương thức 'MapRoute' có tham số 'không gian tên'.

Yêu cầu cho 'Trang chủ' đã tìm thấy các bộ điều khiển phù hợp sau: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

Tôi có một HomeController trong thư mục bộ điều khiển mặc định của mình, với tên lớp là MyCompany.MyProject.WebMvc.Controllers.HomeController.

Phương thức RegisterRoutes của tôi, trong global.asax, trông giống như:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

Sau đó, tôi có một khu vực được gọi là Công ty, với một HomeController trong thư mục bộ điều khiển mặc định cho khu vực, với tên lớp là MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController.

Phương thức RegisterArea trong tệp CompanyAreaRegistration trông giống như sau:

   public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Company_default",
            "Company/{controller}/{action}/{id}",
            new { area = "Company", action = "Index", id = UrlParameter.Optional }
        );
    }

Đây là tất cả dẫn đến lỗi mà tôi đã đánh dấu ở đầu bài đăng này. Tôi đang đấu tranh để cố gắng tổng hợp một giải pháp từ nhiều bài đăng khác, mà KHÔNG MAY MẮN .

Có thể có một HomeController trong thư mục bộ điều khiển mặc định và sau đó một trong MỖI khu vực không? Nếu vậy, tôi có cần thực hiện (giả sử là có) thay đổi đối với tệp cấu hình của mình để làm cho việc này hoạt động không?

Bất kì sự trợ giúp nào đều được đánh giá cao!


Tham khảo stackoverflow.com/a/12633541/2089963 này . Nó làm việc cho tôi
Syed Mohamed

Điều này xảy ra với tôi khi tôi đổi tên dự án / lắp ráp, tôi chỉ cần xóa thư mục bin và biên dịch lại dự án và nó hoạt động tốt.
Core

Câu trả lời:


167

Thông báo lỗi chứa giải pháp được đề xuất: "Nếu đúng như vậy, hãy đăng ký tuyến đường này bằng cách gọi quá tải phương thức 'MapRoute' có tham số 'không gian tên'."

routes.MapRoute(
     "Default", // Route name
     "{controller}/{action}/{id}", // URL with parameters
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
     new string[] { "MyCompany.MyProject.WebMvc.Controllers"}
);

Điều này sẽ làm cho http: // server / chuyển đến hành động Chỉ mục của HomeController, theo tôi nghĩ, đó là những gì bạn muốn. http: // server / company / home sẽ chuyển đến hành động Chỉ mục HomeController của khu vực Công ty, như được xác định trong đăng ký khu vực.


1
Tôi đã không kiểm tra nó, nhưng namespacestham số là một mảng chuỗi, vì vậy bạn sẽ có thể vượt qua bất kỳ số bằng cách thêm vào các mảng:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
David Ruttka

2
Mẫu không gian tên đó không phù hợp với tôi. MyProject.Controllerstuy nhiên.
The Muffin Man,

Tôi đã thử cái này. Nhưng chỉ mục trong MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerlớp này đang thực thi. Nhưng View xuất hiện là cái cũ.
kbvishnu

Đáng giá là tham số thứ 4 ở đây có thể hơi khó hiểu vì kiểu suy luận và ý nghĩa biến. Tham số thứ 4 có thể là một mảng chuỗi để ràng buộc bởi không gian tên, một đối tượng để thêm IRouteConstraints HOẶC chuỗi có thể được hiểu là các ràng buộc hoặc bạn có thể có 5 tham số và bao gồm cả hai. aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
Chris Moschini

Cũng cần lưu ý rằng đường dẫn sẽ tìm đường đến các không gian tên khác theo mặc định - nếu bạn muốn khóa đường dẫn đến một không gian tên hoặc tập hợp các không gian tên, bạn phải tắt dự phòng này: bubblogging.wordpress.com/2012/06/09/mvc- định tuyến không gian tên (cuối trang)
Chris Moschini

30

Đây là cách tiếp cận mvc4 của asp.net:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional },
            namespaces: new[] { "YourCompany.Controllers" }
        );

2
cảm ơn, điều này đã giải quyết nó cho tôi, mặc dù tôi không thể tìm ra lý do tại sao ứng dụng của tôi cho rằng có hai bộ điều khiển nhà ngay từ đầu. Tôi đã thực hiện tìm kiếm và thay thế không gian tên, điều này dường như đã gây ra sự cố, nhưng tìm kiếm toàn bộ giải pháp không hiển thị bất kỳ trường hợp nào của không gian tên giả mạo.
Yann Duran

12
Vâng, tôi đã tìm ra nguyên nhân của vấn đề của mình. Hy vọng rằng điều này có thể giúp ai đó khác đang tuyệt vọng tìm kiếm, như tôi ngày hôm nay. Bởi vì tôi đã thay đổi tên của ứng dụng (cũng như không gian tên), vẫn còn một tệp DLL trong thư mục bin chưa bị xóa sạch. Chắc hẳn có một số phép thuật MEF đang diễn ra dưới vỏ bọc. Ngay sau khi tôi phát hiện và xóa DLL cũ, sự cố đã biến mất. Không có gì ngạc nhiên khi tìm kiếm văn bản không tìm thấy nó!
Yann Duran

@YannDuran, đã gặp sự cố tương tự và bản sửa lỗi của bạn đã giúp được. Cảm ơn.
Klaus Nji

12

Tôi đã đổi tên các không gian tên, vì vậy, tôi chỉ xóa de thư mục binobjxây dựng lại , hoạt động lại.



2

dùng cái này

routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "ProjectName.Controllers" }
        );

1

Chỉ sử dụng tên của dự án:

Public Class RouteConfig
    Public Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
        routes.MapRoute( _
            name:="Default", _
            url:="{controller}/{action}/{id}", _
            defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
           , namespaces:={"MvcAreas"})  
    End Sub

1

Nếu bạn đang sử dụng RazorGenerator, chỉ thông báo namespacestham số là không đủ.

Tôi phải giải quyết bằng cách thêm câu lệnh được đánh dấu bên dưới tại Global.asax.cs:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        ControllerBuilder.Current.DefaultNamespaces.Add("MyProject.Controllers"); // This one
    }

0

Như Chris Moschini đã đề cập, tham số không gian tên có thể không đủ nếu bạn có hai khu vực có cùng tên bộ điều khiển với không gian tên khác nhau và tuyến đường không khu vực mặc định sẽ trả về lỗi máy chủ 500.

routes.MapRoute(
     "Default", // Route name
     "{controller}/{action}/{id}", // URL with parameters
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
     new string[] { "MyCompany.MyProject.WebMvc.Controllers"}
);

Tốt nhất là ghi đè trình xử lý tuyến đường mặc định và thêm dòng này:

RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = false;

0

Tôi gặp sự cố này sau khi tôi thêm tham chiếu vào một dự án khác có cùng các tuyến đường và sự cố vẫn tiếp diễn sau khi tôi xóa tham chiếu.

Giải quyết bằng cách xóa tệp .dll của tham chiếu đã thêm đó khỏi thư mục bin và xây dựng lại.


0

Giống như nhiều người khác, tôi gặp sự cố này sau khi tạo dự án mẫu MVC mới từ menu VS2017, khi xây dựng dự án, tôi sẽ nhận được thông báo lỗi của op. Sau đó, tôi đã sử dụng câu trả lời https://stackoverflow.com/a/15651619/2417292 được đăng trước đó trong chủ đề này bằng cooloverride cho các dự án mvc4. Điều này vẫn không khắc phục được sự cố của tôi, vì vậy tôi đã đổi tên thư mục Home view và tệp HomeController thành thư mục xem Company / và tệp điều khiển CompanyController. Điều này sau đó đã hoạt động đối với tôi, không phải là một bản sửa lỗi mà là một cách giải quyết nếu bạn không gặp khó khăn trong việc có tuyến Trang chủ / Chỉ mục vấn đề khác của tôi là tôi không thể tìm thấy tham chiếu gây ra lỗi và do nền tảng nhà phát triển của tôi là Azure WebApplication vs a máy ảo đầy đủ với hệ thống tệp hoàn chỉnh và các cài đặt IIS để gây rối.


0

Tôi gặp sự cố tương tự và thấy rằng phiên bản cũ hơn đã tạo các tệp đã biên dịch trong thư mục "bin".

Sau khi tôi xóa những lỗi này, lỗi đã biến mấ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.