Beberapa jenis ditemukan yang cocok dengan pengontrol bernama 'Home'

318

Saat ini saya memiliki dua proyek MVC3 yang tidak terkait yang diselenggarakan secara online.

Satu berfungsi dengan baik, yang lain tidak berfungsi, memberi saya kesalahan:

Beberapa jenis ditemukan yang cocok dengan pengontrol yang bernama 'Rumah'. Ini dapat terjadi jika rute yang melayani permintaan ini ('{controller} / {action} / {id}') tidak menentukan ruang nama untuk mencari controller yang cocok dengan permintaan.

Jika ini masalahnya, daftarkan rute ini dengan memanggil kelebihan metode 'MapRoute' yang mengambil parameter 'namespaces'.

Cara kerja hoster saya adalah dia memberi saya akses FTP dan di folder itu saya punya dua folder lain, satu untuk masing-masing aplikasi saya.

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

foo.com berfungsi dengan baik, saya menerbitkan aplikasi saya ke sistem file lokal saya kemudian FTP isinya dan berfungsi.

Ketika saya mengunggah dan mencoba menjalankan bar.com, masalah di atas menyala dan mencegah saya menggunakan situs saya. Semua sementara foo.com masih berfungsi .

Apakah bar.com mencari dari pengontrol DI MANA SAJA di dalam ftpFolderA2 dan itulah mengapa ia mencari yang lain HomeController? Bagaimana saya bisa mengatakannya untuk hanya melihat di folder Controller sebagaimana mestinya?

Fakta:

  1. Tidak menggunakan area. Ini adalah dua proyek yang sama sekali tidak terkait. Saya menempatkan setiap proyek yang diterbitkan ke masing-masing folder masing-masing. Tidak ada yang mewah.
  2. Setiap proyek hanya memiliki 1 HomeController.

Adakah yang bisa mengkonfirmasi ini masalahnya?

Hanya orang Bolivia disini
sumber
Pertanyaan yang sangat tidak jelas. Apakah Anda menggunakan area? Apakah masalah terjadi secara lokal?
Darin Dimitrov
1
@Darin: Diedit informasi itu di.
Hanya Bolivia Di Sini

Jawaban:

473

Pesan kesalahan ini sering terjadi ketika Anda menggunakan area dan Anda memiliki nama pengontrol yang sama di dalam area dan root. Misalnya, Anda memiliki keduanya:

  • ~/Controllers/HomeController.cs
  • ~/Areas/Admin/Controllers/HomeController.cs

Untuk mengatasi masalah ini (seperti pesan kesalahan menyarankan Anda), Anda bisa menggunakan ruang nama saat mendeklarasikan rute Anda. Jadi dalam definisi rute utama di Global.asax:

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

dan di Anda ~/Areas/Admin/AdminAreaRegistration.cs:

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Areas.Admin.Controllers" }
);

Jika Anda tidak menggunakan area, tampaknya kedua aplikasi Anda di-host di dalam aplikasi ASP.NET yang sama dan konflik terjadi karena Anda memiliki pengontrol yang sama didefinisikan dalam ruang nama yang berbeda. Anda harus mengkonfigurasi IIS untuk menampung keduanya sebagai aplikasi ASP.NET terpisah jika Anda ingin menghindari konflik semacam itu. Tanyakan penyedia hosting Anda untuk ini jika Anda tidak memiliki akses ke server.

Darin Dimitrov
sumber
Saya tidak menggunakan area sama sekali. Ini adalah dua aplikasi yang sama sekali tidak terkait yang berada di folder terpisah di dalam folder root FTP. Mungkin aplikasi saya mencari pengontrol MVC di mana pun ia bisa dan jangkauan itu kebetulan meluas ke Pengendali Rumah lainnya. Bagaimana saya bisa mengatakannya agar tidak mencari di mana pun tetapi itu adalah folder Controller sendiri dan mengabaikan sisanya?
Hanya Orang Bolivia Di Sini
2
@SergioTapia, sepertinya mereka cukup terkait dengan aplikasi Anda. Penyedia hosting Anda memasukkannya ke dalam aplikasi ASP.NET yang sama. Anda harus memintanya membaginya dalam IIS sebagai contoh terpisah atau Anda akan memiliki banyak masalah.
Darin Dimitrov
13
Terima kasih. Di ASP MVC 4.0 Anda harus memberikan argumen bernama seperti namespaces: new [] {"AppName.Areas.Admin.Controllers"}
om471987
1
+1 - Bekerja dengan baik. Saya tidak menyadari ada daerah terpisah untuk pendaftaran rute di daerah-daerah. Di mana-mana saya melihat sepertinya ada jawaban berkualitas dari Darin :)
Travis J
1
Jika Anda menggunakan area dan ingin namespace pengendali, Anda perlu namespace baik rute di dalam area maupun di luar. Hanya namespacing rute area yang masih memberi saya masalah ini.
Gavin Ward
528

Berikut adalah skenario lain di mana Anda mungkin menghadapi kesalahan ini. Jika Anda mengubah nama proyek Anda sehingga nama file majelis berubah, Anda mungkin memiliki dua versi perakitan ASP.NET, yang akan mereproduksi kesalahan ini.

Solusinya adalah pergi ke binfolder Anda dan menghapus dll lama. (Saya mencoba "Rebuild Project", tetapi itu tidak menghapusnya, jadi pastikan untuk memeriksa binuntuk memastikan mereka sudah pergi)

Kirk Woll
sumber
1
Variasi lain dari kesalahan ini adalah ketika Anda menggunakan resharper dan Anda menggunakan beberapa opsi refactor "otomatis" yang mencakup penggantian nama namespace. Inilah yang terjadi pada saya.
Sebastian 506563
5
Jika Anda mendapatkan ini dari Layanan Aplikasi Azure, buka https: // <your_app_name_here> .scm.azurewebsites.net / DebugConsole untuk masuk dan menghapus file.
Tom Blodget
5
Terima kasih, ini adalah masalah bagi saya. Saya telah membuat proyek "baru" dengan menyalin / menempelkan proyek yang ada ke folder baru; dll membangun tua datang dengan, menghapus folder bin menyeka bersih
brando
Saya mendapatkan ini ketika memindahkan file proyek saya ke drive kedua. Membersihkan folder bin menyelesaikannya. Hal yang paling aneh.
Roberto Bonini
Yah itu adalah kesalahan yang sangat menyakitkan dengan perbaikan yang sangat sederhana. Terima kasih!
Troy Grosfield
63

Di MVC4 & MVC5 Agak sedikit berbeda, gunakan berikut ini

/App_Start/RouteConfig.cs

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

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

dan di Area

context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                new[] { "MyNamespace.Areas.Admin.Controllers" }
            );
Pengembang
sumber
39

Tonton ini ... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

Maka gambar ini (harap kamu suka gambar saya)

masukkan deskripsi gambar di sini

Tom
sumber
Memecahkan masalah ..! :)
Aruna
1
@ppkinkin mengatakan itu kepada programmer yang buta. Teksnya dapat dibaca oleh pembaca layar
Carlos Muñoz
Hai Carlos. Ya saya mengerti situasinya. Sudah sulit menjelaskannya orang tanpa cacat visibilitas. Saya bahkan tidak yakin perangkat lunak bantu apa pun akan dapat menggambarkan apa yang terjadi dalam gambar dengan baik untuk semua orang. Itu menarik perhatian bahwa jawabannya mungkin harus memiliki teks setidaknya mencoba menggambarkan apa yang sedang terjadi.
Piotr Kula
32

Apa yang orang lain katakan benar tetapi bagi mereka yang masih menghadapi masalah yang sama:
Dalam kasus saya itu terjadi karena saya menyalin proyek lain dan menamainya menjadi sesuatu yang lain TETAPI file output sebelumnya di binfolder masih ada ... Dan sayangnya, memukul Build -> Clean Solutionsetelah mengganti nama menjadi proyek dan Namespaces itu tidak menghapusnya ... jadi menghapusnya secara manual memecahkan masalah saya!

Dr TJ
sumber
2
saran Anda menyelamatkan saya
Abhimanyu
1
saya juga, terima kasih, bersih dosnt sebenarnya berarti bersih, grrrr
katibaer
1
Terima kasih @DrTJ Ini sangat menyebalkan! Anda berharap proses bersih bersih bekerja dan harapan adalah akar kegagalan. Ini menyelamatkan saya menarik rambut saya lebih jauh!
Mike
28

dalam bin/folder proyek Anda

pastikan Anda hanya memiliki PROJECT_PACKAGENAME.DLL Anda

dan hapus ANOTHER_PROJECT_PACKAGENAME.DLL

yang mungkin muncul di sini karena kesalahan atau Anda hanya mengganti nama proyek Anda

Sruit A.Suk
sumber
2
Persis masalah saya. Terima kasih.
Detailium
Bekerja untukku! terima kasih!
eyal
Saya telah mengubah nama majelis dan memiliki beberapa dll lama duduk di tempat sampah. Terima kasih
apc
Terima kasih! Saya tidak percaya saya melewatkan sesuatu yang begitu sederhana.
Vash
25

Periksa folder bin jika ada file dll lain yang mungkin memiliki konflik dengan kelas homeController.

Amir Shrestha
sumber
7
Ini menggigit saya ketika menyalin proyek dan mengganti nama itu ... proyek lama bernama dll masih di tempat sampah, pembersihan tidak menghapusnya ... Saya harus menghapusnya secara manual!
Paul Zahra
2
Ini masalah bagi saya. Seorang kolega secara tidak sengaja menambahkan referensi dari satu proyek front-end ke proyek menciptakan masalah ini. Dia menghapus referensi, sehingga Visual Studio juga menghapus file dll di disk-nya. Saya menarik pembaruan dari Git, referensi hilang, tetapi file dll tetap, bahkan setelah bersih. Hanya karena VS saya tidak melihat referensi lagi. Tetapi ketika menjalankan IIS melihat file dan menggunakannya. Menghapusnya dari disk saya membantu.
Yeronimo
14

Solusi lain adalah mendaftarkan namespace default dengan ControllerBuilder. Karena kami memiliki banyak rute dalam aplikasi utama kami dan hanya satu rute generik di wilayah kami (di mana kami telah menentukan namespace), kami menemukan ini menjadi solusi termudah:

ControllerBuilder.Current
     .DefaultNamespaces.Add("YourApp.Controllers");
Ben Foster
sumber
Inilah yang terjadi pada saya. Jika Anda benar-benar memiliki banyak pengontrol dengan nama yang sama, ini mungkin diperlukan setelah Anda menambahkan ruang nama ke definisi rute Anda. Misalnya, untuk beranda Anda tempat controller dan area tidak dipilih secara eksplisit oleh path.
Jason Beck
Dalam proyek yang saya kerjakan, kami memiliki kantor turnkey utama dengan area untuk pekerjaan klien kustom. Masing-masing memiliki pengontrol 'pengaturan'. Jawaban ini merupakan alternatif yang bagus untuk harus menentukan rute untuk pengontrol pengaturan untuk setiap area.
Derreck Dean
7

Meskipun Anda tidak menggunakan area, Anda masih bisa menentukan di RouteMap Anda namespace mana yang akan digunakan

routes.MapRoute(
    "Default",
    "{controller}/{action}",
    new { controller = "Home", action = "Index" },
    new[] { "NameSpace.OfYour.Controllers" }
);

Tapi sepertinya masalah sebenarnya adalah cara kedua aplikasi Anda diatur di IIS

StanK
sumber
7

Saya baru saja mengalami masalah ini, tetapi hanya ketika saya menerbitkan ke situs web saya, pada debug lokal saya, itu berjalan dengan baik. Saya menemukan saya harus menggunakan FTP dari hosting saya dan masuk ke direktori publish saya dan menghapus file di folder BIN, menghapusnya secara lokal tidak melakukan apa-apa ketika saya menerbitkan.

Mech0z
sumber
Ini adalah perbaikan untuk saya. Profil publikasi saya tidak menghapus file yang tidak ada secara lokal, jadi aplikasi saya mengambil dll lama selain yang baru dan menemukan jenis duplikat.
Formulir
1
Saya mengubah nama proyek saya dan saya refraksi semua file tetapi kemudian saya mendapat kesalahan ini. Menghapus folder bin juga berfungsi untuk saya.
Mauro Valvano
6

Mungkin ada kasus lain dengan Area bahkan Anda telah mengikuti semua langkah dalam routing di Area (seperti memberikan Namespace dalam tabel routing global), yaitu:

Anda mungkin tidak membungkus Pengontrol Global Anda di 'namespace' yang Anda berikan dalam perutean.

Misalnya:

Selesai ini:

public class HomeController : Controller
{

Dari pada:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {
T Gupta
sumber
Ya. Tidak cukup hanya menyediakan namespace di MapRoute. Namespace yang disediakan di sini harus cocok dengan namespace dari kelas controller yang berada. Sekarang berfungsi!
DanKodi
6

Anda juga bisa mendapatkan kesalahan 500 jika Anda menambahkan rakitan Anda sendiri yang berisi ApiController dengan mengesampingkan GetAssemblies dari DefaultAssembliesResolver dan sudah ada dalam array dari base.GetAssemblies ()

Inti masalah:

public class MyAssembliesResolver : DefaultAssembliesResolver
{
    public override ICollection<Assembly> GetAssemblies()
    {
        var baseAssemblies = base.GetAssemblies();

        var assemblies = new List<Assembly>(baseAssemblies);

        assemblies.Add(Assembly.GetAssembly(typeof(MyAssembliesResolver)));

        return new List<Assembly>(assemblies);
    }
}

jika kode di atas berada di rakitan yang sama dengan Controller Anda, rakitan itu akan ada dalam daftar dua kali dan akan menghasilkan 500 kesalahan karena Web API tidak tahu mana yang harus digunakan.

Allan Elder
sumber
6

jika Anda ingin menyelesaikannya secara otomatis .. Anda dapat menggunakan aplikasi ini dengan mudah tambahkan saja kode berikut:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { string.Format("{0}.Controllers", BuildManager.GetGlobalAsaxType().BaseType.Assembly.GetName().Name) }
        );
Xtremexploit
sumber
1
solusi hebat jika Anda memiliki pengontrol yang sama di beberapa proyek
Ravi Anand
4

Punya masalah yang sama dan tidak ada yang membantu. Masalahnya adalah bahwa saya sebenarnya tidak memiliki duplikat, kesalahan ini muncul setelah beralih dari namespace proyek MyCuteProjectke MyCuteProject.Web.

Pada akhirnya saya menyadari bahwa sumber kesalahan adalah global.asaxfile - markup XML, bukan .cs-codebehind. Periksa namespace di dalamnya - itu membantu saya.

Arman Hayots
sumber
2

Saya baru saja menghapus folder 'Bin' dari server dan menyalin bin saya ke server, dan masalah saya terpecahkan.

javad hemati
sumber
2

Di Route.config

namespaces: new [] {"Appname.Controllers"}

Menunggu
sumber
1

Kami menemukan bahwa kami mendapatkan kesalahan ini ketika ada konflik dalam bangunan kami yang muncul sebagai peringatan.

Kami tidak mendapatkan detail sampai kami meningkatkan Visual Studio -> Alat -> Pilihan -> Proyek dan Solusi -> Bangun dan Jalankan -> Proyek MSBuild membangun verbositas keluaran menjadi Detail.

Proyek kami adalah aplikasi web .net v4 dan ada konflik antara System.Net.Http (v2.0.0.0) dan System.Net.Http (v4.0.0.0). Proyek kami mereferensikan versi v2 file dari sebuah paket (termasuk menggunakan nuget). Ketika kami menghapus referensi dan menambahkan referensi ke versi v4 maka build berhasil (tanpa peringatan) dan kesalahan diperbaiki.

AnthonyJ
sumber
1

Variasi lain dari kesalahan ini adalah ketika Anda menggunakan resharper dan Anda menggunakan beberapa opsi refactor "otomatis" yang mencakup penggantian nama namespace. Inilah yang terjadi pada saya. Untuk mengatasi masalah dengan folder penghapusan skenario semacam inibin

Sebastian 506563
sumber
Ini terjadi pada saya ketika saya menyalin ke isi 1 proyek di atas yang lain. Saya harus menghapus file-file spesifik dari folder bin
Adriaan Davel
1

Klik kanan proyek dan pilih bersihkan proyek. Atau yang lain benar-benar mengosongkan direktori bin dan kemudian membangun kembali. Ini harus menghapus semua rakitan yang tersisa dari bangunan sebelumnya

VivekDev
sumber
1

Beberapa waktu dalam satu aplikasi, Masalah ini juga datang. Dalam hal ini pilih kotak centang ini ketika Anda menerbitkan aplikasi Anda masukkan deskripsi gambar di sini

Umang Patwa
sumber
1

Jika itu bisa membantu yang lain, saya juga menghadapi kesalahan ini. Masalahnya disebabkan oleh referensi yang salah di situs web saya. Untuk alasan yang tidak diketahui situs web saya merujuk situs web lain, dalam solusi yang sama. Dan begitu saya menghapus referensi buruk itu, semuanya mulai bekerja dengan baik.

Hugo
sumber
0

Jika Anda bekerja di Episerver, atau CMS berbasis MVC lain, Anda mungkin menemukan bahwa nama pengontrol tertentu telah diklaim.

Ini terjadi pada saya ketika mencoba membuat pengontrol yang disebut FileUpload.


sumber
0

saya menghadapi masalah yang sama. dan alasan utama adalah bahwa saya memiliki pengontrol yang sama di dua Area yang berbeda. setelah saya menghapus salah satu dari mereka itu berfungsi dengan baik.

saya memilikinya akan membantu Anda.

Solusi Proyek

Satish Kumar sonker
sumber
0

Saya memiliki dua Proyek dalam satu Solusi dengan Nama Pengontrol yang Sama. I Menghapus Referensi Proyek kedua dalam Proyek pertama dan Masalah Terselesaikan

Kashif Faraz
sumber
0

Saya telah menemukan kesalahan ini dapat terjadi dengan situs web ASP.NET tradisional ketika Anda membuat Controller di direktori non App_Code (kadang-kadang Visual Studio mencegah ini).

Ini menetapkan jenis file ke "Kompilasi" sedangkan kode apa pun yang ditambahkan ke "App_Code" diatur ke "Konten". Jika Anda menyalin atau memindahkan file ke App_Code maka file itu masih ditetapkan sebagai "Kompilasi".

Saya curiga ada hubungannya dengan operasi Proyek Situs Web karena proyek situs web tidak memiliki operasi pembangunan. Membersihkan folder tempat sampah dan mengubah ke "Konten" tampaknya memperbaikinya.

Curtis White
sumber