Projemde aynı adı taşıyan birden çok denetleyiciyle sorun yaşıyorum


97

ASP.NET MVC 3 projemle aşağıdaki hatayla karşılaşıyorum:

"Ana Sayfa" adlı denetleyiciyle eşleşen birden çok tür bulundu. Bu, bu isteğe hizmet veren yol ("Ana Sayfa / {eylem} / {id}"), istekle eşleşen bir denetleyiciyi aramak için ad alanları belirtmiyorsa olabilir. Bu durumda, bir 'ad alanları' parametresi alan 'MapRoute' yönteminin bir aşırı yüklemesini çağırarak bu rotayı kaydedin.

'Ana Sayfa' isteği aşağıdaki eşleşen denetleyicileri buldu: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

MyCompany.MyProject.WebMvc.Controllers.HomeController sınıf adına sahip varsayılan denetleyici klasörümde bir HomeController var.

Global.asax dosyamdaki RegisterRoutes yöntemim şöyle görünür:

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

Daha sonra, alan için varsayılan denetleyici klasöründe bir HomeController ile, MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController sınıf adıyla Şirket adında bir alanım var.

CompanyAreaRegistration dosyasındaki RegisterArea yöntemi şuna benzer:

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

Bunların hepsi, bu yazının başında vurguladığım hataya öncülük ediyor. NO LUCK ile çeşitli diğer gönderilerden bir çözümü bir araya getirmeye çalışıyorum .

Varsayılan denetleyiciler klasöründe ve ardından HER alanında bir HomeController olması mümkün müdür? Öyleyse, bunun çalışmasını sağlamak için yapılandırma dosyamda (yaptığımı varsayarak) değişiklik yapmam gerekir mi?

Herhangi bir yardım çok takdir edilecektir!


Bu stackoverflow.com/a/12633541/2089963 adresine bakın . Benim için çalışıyor
Syed Mohamed

Bu, projeyi / derlemeyi yeniden adlandırdığımda başıma geliyor, bin klasörünü sildim ve projeyi yeniden derledim ve iyi çalıştı.
Çekirdek

Yanıtlar:


169

Hata mesajı önerilen çözümü içerir: "Bu durumda, bir 'ad alanları' parametresi alan 'MapRoute' yönteminin bir aşırı yüklemesini çağırarak bu yolu kaydedin."

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

Bu, http: // server / HomeController'ın İndeks eylemine gitmesini sağlayacaktır ki bu da bence istediğiniz şeydir. http: // server / company / home , alan kaydında tanımlandığı gibi Şirket alanının HomeController Dizin eylemine gidecektir.


1
Test etmedim, ancak namespacesparametre bir dizge dizisi, bu nedenle diziye ekleyerek herhangi bir sayıyı geçirebilmelisiniz:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
David Ruttka

2
Bu ad alanı kalıbı benim için işe yaramadı. MyProject.ControllersAncak yaptı.
Kek Adam

Bunu denedim. Ancak bu MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllersınıftaki dizin yürütülüyor. Ama Görünüş eski olanıdır.
kbvishnu

Hiçbir şeye değmez, buradaki 4. parametre, tür çıkarımı ve değişken anlamı nedeniyle biraz kafa karıştırıcı olabilir. 4. parametre, ad alanına göre sınırlandırılacak bir dize dizisi, kısıtlamalar olarak yorumlanabilen IRouteConstraints VEYA dizeleri eklemek için bir nesne olabilir veya 5 parametreniz olabilir ve her ikisini de içerebilir. aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
Chris

Ayrıca bir yol, varsayılan olarak diğer ad alanlarına giden yolu bulacaktır - bir ad alanına veya ad alanları kümesine giden yolu kilitlemek istiyorsanız, bu yedeği devre dışı bırakmanız gerekir: bubblogging.wordpress.com/2012/06/09/mvc- yönlendirme ad alanları (sayfanın alt kısmı)
Chris Moschini

30

Bu asp.net mvc4 yaklaşımıdır:

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

2
teşekkürler, bu benim için çözdü, ancak hayatım boyunca uygulamamın neden ilk etapta iki ev kontrol cihazı olduğunu düşündüğünü anlayamıyorum. Soruna neden olmuş gibi görünen ad alanını aradım ve değiştirdim, ancak tüm çözümün aranması sahte ad alanının herhangi bir örneğini göstermiyor.
Yann Duran

12
Sorunumun nedenini buldum. Umarım bu, bugün olduğu gibi umutsuzca arama yapan başka birine yardımcı olabilir. Uygulamanın adını (aynı zamanda ad alanını) değiştirdiğim için, bin klasöründe temiz bir şekilde silinmeyen bir DLL kalmıştı. Örtülerin altında bir MEF büyüsü olmalı. Eski DLL'yi bulup sildiğimde sorun ortadan kalktı. Metin aramanın onu bulmamasına şaşmamalı!
Yann Duran

@YannDuran, benzer bir sorunla karşılaştı ve düzeltmeniz yardımcı oldu. Teşekkürler.
Klaus Nji

12

Öyle, ben sadece, ad alanları değiştirildi etmişti silmek de klasörler bin ve obj ve yeniden tekrar çalışmayı.



2

bunu kullan

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

2

RazorGenerator kullanıyorsanız, sadece namespacesparametreyi bilgilendirmek yeterli olmayabilir.

Aşağıdaki ifadeyi şu adreste ekleyerek çözmeliyim 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
    }

1

Yalnızca projenin adını kullanı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

0

Chris Moschini'nin bahsettiği gibi, farklı ad alanlarına sahip aynı denetleyici adına sahip iki alanınız varsa ad alanları parametresi yeterli olmayabilir ve varsayılan yok alan yolu 500 sunucu hatası döndürür.

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

Varsayılan yol işleyiciyi geçersiz kılmak ve şu satırı eklemek "en iyisidir":

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

0

Aynı rotalara sahip başka bir projeye referans ekledikten sonra bu sorunu yaşadım ve referansı kaldırdıktan sonra sorun devam etti.

Bin klasöründen eklenen bu referansın .dll dosyası silinerek ve yeniden oluşturularak çözüldü.


0

Diğerleri gibi, VS2017 menüsünden yeni bir MVC şablon projesi oluşturduktan sonra bu sorunu yaşadım, projeyi oluştururken operasyonun hata mesajını alacağım. Daha sonra mvc4 projeleri için cooloverride tarafından bu konu başlığında daha önce yayınlanan https://stackoverflow.com/a/15651619/2417292 cevabını kullandım . Bu yine de sorunumu çözmedi, bu yüzden Ana Sayfa görünümü klasörümü ve HomeController dosyasını, Şirket / denetleyici dosyası ve CompanyController denetleyici dosyası olarak yeniden adlandırdım. Bu daha sonra benim için çalıştı, söz başına bir düzeltme değil, Ana Sayfa / Dizin rotasına sahip olmaya takılmadıysanız bir geçici çözüm benim diğer sorunum, hataya neden olan referansı bulamadım ve geliştirme platformumun Azure WebApplication vs a olması nedeniyle tam bir dosya sistemi ve IIS ayarları ile tam sanal makine.


0

Aynı sorunu yaşadım ve eski sürümün "bin" klasöründe derlenmiş dosyalar oluşturduğunu gördüm.

Bunları sildikten sonra hata kayboldu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.