Mengalami masalah dengan beberapa pengontrol dengan nama yang sama di proyek saya

96

Saya mengalami kesalahan berikut ini dengan proyek ASP.NET MVC 3 saya:

Beberapa jenis ditemukan yang cocok dengan pengontrol bernama 'Rumah'. Ini bisa terjadi jika rute yang melayani permintaan ini ('Home / {action} / {id}') tidak menentukan namespace untuk mencari pengontrol yang cocok dengan permintaan tersebut. Jika demikian, daftarkan rute ini dengan memanggil metode 'MapRoute' yang kelebihan beban yang mengambil parameter 'ruang nama'.

Permintaan untuk 'Home' telah menemukan pengontrol yang cocok berikut ini: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

Saya memiliki HomeController di folder kontroler default saya, dengan nama kelas MyCompany.MyProject.WebMvc.Controllers.HomeController.

Metode RegisterRoutes saya, di global.asax saya, terlihat seperti:

    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
        );
    }

Saya kemudian memiliki area bernama Perusahaan, dengan HomeController di folder pengontrol default untuk area tersebut, dengan nama kelas MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController.

Metode RegisterArea di file CompanyAreaRegistration terlihat seperti:

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

Ini semua memimpin kesalahan yang saya soroti di awal posting ini. Saya berjuang mencoba mengumpulkan solusi dari berbagai posting lain, dengan NO LUCK .

Apakah mungkin untuk memiliki HomeController di folder pengontrol default dan kemudian satu di area SETIAP? Jika demikian, apakah saya perlu melakukan (dengan asumsi saya melakukannya) perubahan pada file konfigurasi saya agar ini berfungsi?

Bantuan apa pun akan sangat dihargai!

mattruma
sumber
Lihat stackoverflow.com/a/12633541/2089963 ini . Ini bekerja untuk saya
Syed Mohamed
Ini terjadi pada saya ketika saya mengganti nama proyek / perakitan, saya baru saja menghapus folder bin dan mengkompilasi ulang proyek dan itu berfungsi dengan baik.
Inti

Jawaban:

167

Pesan kesalahan berisi solusi yang disarankan: "Jika ini kasusnya, daftarkan rute ini dengan memanggil metode 'MapRoute' yang kelebihan muatan yang mengambil parameter 'ruang nama'."

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"}
);

Ini akan membuat http: // server / pergi ke tindakan Indeks HomeController Anda, yang menurut saya, adalah yang Anda inginkan. http: // server / perusahaan / rumah akan masuk ke tindakan Indeks HomeController area Perusahaan, sebagaimana ditentukan dalam pendaftaran area.

David Ruttka
sumber
1
Saya belum mengujinya, tetapi namespacesparameternya adalah array string, jadi Anda harus dapat meneruskan nomor apa pun dengan menambahkan ke array:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
David Ruttka
2
Pola namespace itu tidak berhasil untuk saya. MyProject.Controllerslakukan bagaimanapun.
The Muffin Man
Saya mencoba yang ini. Tetapi indeks di MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerkelas ini sedang dieksekusi. Namun Tampilan yang muncul adalah yang lama.
kbvishnu
Tidak ada gunanya bahwa parameter ke-4 di sini bisa sedikit membingungkan karena inferensi tipe dan arti variabel. Parameter ke-4 dapat berupa larik string yang dibatasi oleh namespace, objek untuk menambahkan IRouteConstraints ATAU string yang dapat diartikan sebagai pembatas, atau Anda dapat memiliki 5 parameter dan menyertakan keduanya. aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
Chris Moschini
Juga perlu diperhatikan bahwa jalur akan menemukan jalannya ke namespace lain secara default - jika Anda ingin mengunci jalur ke namespace atau kumpulan namespace, Anda harus menonaktifkan fallback ini: bubblogging.wordpress.com/2012/06/09/mvc- routing-namespaces (bagian bawah halaman)
Chris Moschini
30

Ini adalah pendekatan mvc4 asp.net:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional },
            namespaces: new[] { "YourCompany.Controllers" }
        );
pendinginan
sumber
2
terima kasih, ini menyelesaikannya untuk saya, meskipun saya tidak tahu seumur hidup mengapa aplikasi saya berpikir ada dua pengontrol rumah di tempat pertama. Saya melakukan pencarian & penggantian namespace, yang tampaknya menyebabkan masalah, tetapi pencarian seluruh solusi tidak menunjukkan contoh namespace nakal.
Yann Duran
12
Nah, saya menemukan penyebab masalah saya. Mudah-mudahan ini dapat membantu orang lain yang mati-matian mencari, seperti saya hari ini. Karena saya telah mengubah nama aplikasi (serta namespace), masih ada DLL yang tersisa di folder bin yang tidak terhapus oleh clean. Pasti ada keajaiban MEF yang terjadi di balik selimut. Segera setelah saya menemukan & menghapus DLL lama, masalahnya hilang. Tidak heran jika pencarian teks tidak menemukannya!
Yann Duran
@YannDuran, mengalami masalah serupa dan perbaikan Anda membantu. Terima kasih.
Klaus Nji
12

Saya telah mengganti nama namespace, jadi, saya hanya menghapus de folder bin dan obj dan membangun kembali , bekerja lagi.

Reynaldo
sumber
2

Gunakan ini

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

Gunakan hanya nama proyek:

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
glownet
sumber
1

Jika Anda menggunakan RazorGenerator, memberi tahu namespacesparameter saja tidak cukup.

Saya harus menyelesaikan menambahkan pernyataan yang ditandai di bawah ini di 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
    }
Leonel Sanches da Silva
sumber
0

Seperti yang dikatakan Chris Moschini, parameter namespaces mungkin tidak cukup jika Anda memiliki dua area dengan nama pengontrol yang sama dengan namespace yang berbeda dan rute default area tidak ada akan mengembalikan kesalahan server 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"}
);

Itu "terbaik" untuk mengganti pengendali rute default dan menambahkan baris ini:

RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = false;
XzaR
sumber
0

Saya mengalami masalah ini setelah saya menambahkan referensi ke proyek lain yang memiliki rute yang sama dan masalah berlanjut setelah saya menghapus referensi tersebut.

Diatasi dengan menghapus file .dll dari referensi yang ditambahkan itu dari folder bin dan membangunnya kembali.

Logan Miller
sumber
0

Seperti banyak orang lain, saya mengalami masalah ini setelah membuat proyek template MVC baru dari menu VS2017, saat membangun proyek saya akan mendapatkan pesan kesalahan operasi. Saya kemudian menggunakan jawaban https://stackoverflow.com/a/15651619/2417292 yang diposting sebelumnya di utas ini dengan cooloverride untuk proyek mvc4. Ini masih tidak memperbaiki masalah saya, jadi saya mengganti nama folder tampilan Beranda dan file HomeController saya menjadi folder tampilan Perusahaan / dan file pengontrol CompanyController. Ini kemudian bekerja untuk saya, bukan perbaikan per kata tetapi solusi jika Anda tidak terjebak memiliki rute Beranda / Indeks masalah saya yang lain adalah saya tidak dapat menemukan referensi yang menyebabkan kesalahan dan karena platform dev saya adalah Azure WebApplication vs a VM penuh dengan sistem file lengkap dan pengaturan IIS untuk dipusingkan.

Eddie.Power_AU
sumber
0

Saya mengalami masalah yang sama dan menemukan bahwa versi yang lebih lama telah membuat file yang dikompilasi di folder "bin".

Setelah saya menghapus ini, kesalahan tersebut menghilang.

Pavan Arunod
sumber