มีปัญหากับคอนโทรลเลอร์หลายตัวที่มีชื่อเดียวกันในโปรเจ็กต์ของฉัน


97

ฉันพบข้อผิดพลาดต่อไปนี้กับโครงการ ASP.NET MVC 3 ของฉัน:

พบหลายประเภทที่ตรงกับคอนโทรลเลอร์ชื่อ 'Home' กรณีนี้อาจเกิดขึ้นได้หากเส้นทางที่ให้บริการคำขอนี้ ("Home / {action} / {id}") ไม่ได้ระบุเนมสเปซเพื่อค้นหาตัวควบคุมที่ตรงกับคำขอ ในกรณีนี้ให้ลงทะเบียนเส้นทางนี้โดยเรียกใช้เมธอด 'MapRoute' ที่โอเวอร์โหลดซึ่งใช้พารามิเตอร์ 'เนมสเปซ'

คำขอสำหรับ 'Home' พบตัวควบคุมที่ตรงกันดังต่อไปนี้: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

ฉันมี HomeController ในโฟลเดอร์ตัวควบคุมเริ่มต้นของฉันโดยมีชื่อคลาสเป็น MyCompany.MyProject.WebMvc.Controllers.HomeController

เมธอด RegisterRoutes ของฉันใน global.asax ของฉันดูเหมือนว่า:

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

จากนั้นฉันมีพื้นที่ที่เรียกว่า Company โดยมี HomeController ในโฟลเดอร์ตัวควบคุมเริ่มต้นสำหรับพื้นที่โดยมีชื่อคลาสเป็น MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

เมธอด RegisterArea ในไฟล์ CompanyAreaRegistration มีลักษณะดังนี้:

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

ทั้งหมดนี้นำไปสู่ข้อผิดพลาดที่ฉันเน้นไว้ในตอนต้นของโพสต์นี้ ฉันกำลังดิ้นรนพยายามที่จะปะติดปะต่อวิธีการแก้ปัญหาจากโพสต์อื่น ๆ ด้วยไม่มีโชค

เป็นไปได้หรือไม่ที่จะมี HomeController ในโฟลเดอร์ตัวควบคุมเริ่มต้นและหนึ่งตัวในพื้นที่แต่ละตัว? ถ้าเป็นเช่นนั้นฉันต้องทำการเปลี่ยนแปลง (สมมติว่าฉันทำ) กับไฟล์คอนฟิกูเรชันของฉันเพื่อให้สามารถใช้งานได้หรือไม่

ความช่วยเหลือใด ๆ จะได้รับการชื่นชมมาก!


อ้างถึงstackoverflow.com/a/12633541/2089963นี้ มันได้ผลสำหรับฉัน
Syed Mohamed

สิ่งนี้เกิดขึ้นกับฉันเมื่อฉันเปลี่ยนชื่อโปรเจ็กต์ / แอสเซมบลีฉันเพิ่งลบโฟลเดอร์ bin และคอมไพล์โปรเจ็กต์ใหม่และทำงานได้ดี
Core

คำตอบ:


169

ข้อความแสดงข้อผิดพลาดมีวิธีแก้ไขที่แนะนำ: "หากเป็นกรณีนี้ให้ลงทะเบียนเส้นทางนี้โดยเรียกใช้เมธอด" MapRoute "ที่โอเวอร์โหลดซึ่งใช้พารามิเตอร์" เนมสเปซ ""

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

ซึ่งจะทำให้ http: // เซิร์ฟเวอร์ /ไปที่การกระทำดัชนี HomeController ของคุณซึ่งฉันคิดว่าสิ่งที่คุณต้องการ http: // server / company / homeจะไปที่การดำเนินการ HomeController's Index ของพื้นที่ บริษัท ตามที่กำหนดไว้ในการลงทะเบียนพื้นที่


1
ฉันยังไม่ได้ทดสอบ แต่namespacesพารามิเตอร์เป็นสตริงอาร์เรย์ดังนั้นคุณควรจะส่งผ่านตัวเลขใดก็ได้โดยเพิ่มในอาร์เรย์:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
David Ruttka

2
รูปแบบเนมสเปซนั้นใช้ไม่ได้กับฉัน MyProject.Controllersอย่างไรก็ตาม
The Muffin Man

ฉันลองอันนี้แล้ว แต่ดัชนีในMyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerคลาสนี้กำลังดำเนินการ แต่มุมมองที่ปรากฏเป็นภาพเก่า
kbvishnu

ไม่มีค่าอะไรที่พารามิเตอร์ตัวที่ 4 ที่นี่อาจทำให้สับสนเล็กน้อยเนื่องจากการอนุมานประเภทและความหมายตัวแปร พารามิเตอร์ตัวที่ 4 สามารถเป็นสตริงอาร์เรย์เพื่อ จำกัด โดยเนมสเปซซึ่งเป็นอ็อบเจ็กต์เพื่อเพิ่ม IRouteConstraints หรือสตริงที่สามารถตีความเป็นข้อ จำกัด หรือคุณสามารถมีพารามิเตอร์ 5 ตัวและรวมทั้งสองอย่างก็ได้ aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
Chris Moschini

นอกจากนี้ควรสังเกตว่าเส้นทางจะหาทางไปยังเนมสเปซอื่นตามค่าเริ่มต้น - หากคุณต้องการล็อกเส้นทางไปยังเนมสเปซหรือชุดของเนมสเปซคุณต้องปิดการใช้งานทางเลือกนี้: bubblogging.wordpress.com/2012/06/09/mvc- Routing-namespaces (ด้านล่างของหน้า)
Chris Moschini

30

นี่คือแนวทาง mvc4 ของ asp.net:

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

2
ขอบคุณสิ่งนี้แก้ไขให้ฉันแม้ว่าฉันจะไม่สามารถเข้าใจชีวิตของฉันได้ว่าทำไมแอปพลิเคชันของฉันถึงคิดว่ามีตัวควบคุมบ้านสองตัว ฉันทำการค้นหาและแทนที่เนมสเปซซึ่งดูเหมือนว่าจะทำให้เกิดปัญหา แต่การค้นหาโซลูชันทั้งหมดไม่แสดงอินสแตนซ์ของเนมสเปซที่หลอกลวง
Yann Duran

12
ฉันพบสาเหตุของปัญหาแล้ว หวังว่านี่อาจช่วยให้คนอื่นค้นหาอย่างหมดหวังอย่างที่ฉันเป็นอยู่ทุกวันนี้ เนื่องจากฉันได้เปลี่ยนชื่อแอปพลิเคชัน (เช่นเดียวกับเนมสเปซ) จึงยังมี DLL เหลืออยู่ในโฟลเดอร์ bin ที่ไม่ได้รับการลบโดย clean ต้องมีเวทย์มนตร์ MEF เกิดขึ้นภายใต้ผ้าคลุม ทันทีที่ฉันค้นพบและลบ DLL เก่าปัญหาก็หายไป ไม่น่าแปลกใจที่ค้นหาข้อความไม่พบ!
Yann Duran

@YannDuran พบปัญหาที่คล้ายกันและได้รับการแก้ไขแล้ว ขอบคุณ.
Klaus Nji

12

ฉันได้เปลี่ยนชื่อเนมสเปซดังนั้นฉันจึงลบโฟลเดอร์binและobj เท่านั้นและสร้างใหม่ทำงานอีกครั้ง




2

หากคุณใช้ RazorGenerator การแจ้งnamespacesพารามิเตอร์อาจไม่เพียงพอ

ฉันต้องแก้เพิ่มคำสั่งด้านล่างที่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

ใช้เฉพาะชื่อโครงการ:

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 กล่าวถึงพารามิเตอร์เนมสเปซอาจไม่เพียงพอหากคุณมีสองพื้นที่ที่มีชื่อคอนโทรลเลอร์เดียวกันโดยมีเนมสเปซต่างกันและเส้นทางพื้นที่ที่ไม่มีค่าเริ่มต้นจะส่งกลับข้อผิดพลาด 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"}
);

"ดีที่สุด" ที่จะแทนที่ตัวจัดการเส้นทางเริ่มต้นและเพิ่มบรรทัดนี้:

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

0

ฉันประสบปัญหานี้หลังจากเพิ่มการอ้างอิงไปยังโครงการอื่นที่มีเส้นทางเดียวกันและปัญหายังคงดำเนินต่อไปหลังจากที่ฉันลบข้อมูลอ้างอิงออก

แก้ไขได้โดยการลบไฟล์. dll ของการอ้างอิงที่เพิ่มนั้นออกจากโฟลเดอร์ bin และสร้างใหม่


0

เช่นเดียวกับคนอื่น ๆ ฉันมีปัญหานี้หลังจากสร้างโครงการเทมเพลต MVC ใหม่จากเมนู VS2017 ในการสร้างโครงการฉันจะได้รับข้อความแสดงข้อผิดพลาดของ op จากนั้นฉันใช้คำตอบhttps://stackoverflow.com/a/15651619/2417292โพสต์ก่อนหน้านี้ในหัวข้อนี้โดยcooloverride สำหรับโครงการ mvc4 สิ่งนี้ยังไม่สามารถแก้ไขปัญหาของฉันได้ดังนั้นฉันจึงเปลี่ยนชื่อโฟลเดอร์ Home view และไฟล์ HomeController เป็นโฟลเดอร์มุมมอง บริษัท / และไฟล์คอนโทรลเลอร์ CompanyController สิ่งนี้ใช้ได้ผลสำหรับฉันไม่ใช่การแก้ไขต่อการพูด แต่เป็นวิธีแก้ปัญหาหากคุณไม่ติดขัดในการมีเส้นทาง Home / Index ปัญหาอื่นของฉันคือฉันไม่พบข้อมูลอ้างอิงที่ทำให้เกิดข้อผิดพลาดและเนื่องจากแพลตฟอร์มการพัฒนาของฉันเป็น Azure WebApplication เทียบกับ a VM เต็มรูปแบบพร้อมระบบไฟล์ที่สมบูรณ์และการตั้งค่า IIS ให้วุ่นวาย


0

ฉันมีปัญหาเดียวกันและพบว่าเวอร์ชันเก่าได้สร้างไฟล์ที่คอมไพล์แล้วในโฟลเดอร์ "bin"

เมื่อฉันลบข้อผิดพลาดเหล่านี้หายไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.