Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Controller with same name as an area - Asp.Net MVC4

I have a Contacts controller in the main/top area, and I have an area named "Contacts".

I get POST 404s to the Contacts controller if I register my areas before I register my top-level routes:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        ModelBinders.Binders.DefaultBinder = new NullStringBinder();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }

And, if I register my areas after my routes, my 404s to the Contacts controller goes away, but my routes to the Contacts area are now 404s.

...lots of duplicate controller name questions logged, but I haven't found a specific scenario where the area is the same name as the controller.

...probably an easy fix. Would appreciate help. :-D

fwiw, I am registering my Contacts area with an explicit namespace:

    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[] { "MyMvcApplication.Controllers" }
        );
    }
like image 580
Trober Avatar asked Nov 04 '13 21:11

Trober


People also ask

Can we have two methods with same name in controller?

To answer your specific question, you cannot have two methods with the same name and the same arguments in a single class; using the HttpGet and HttpPost attributes doesn't distinguish the methods.

Can we have multiple controllers in MVC?

In Spring MVC, we can create multiple controllers at a time. It is required to map each controller class with @Controller annotation.


1 Answers

There are two things to consider

  1. In Application_Start() method register areas first AreaRegistration.RegisterAllAreas();.

  2. In case of conflicting name, use the namespaces in RouteConfig.cs file of App_Start folder as well as all the routes defined in routes (like ContactsAreaRegistration.cs)

To replicate your scenario, I created a sample application and able to access successfully both URLs given below:

http://localhost:1200/Contacts/Index

http://localhost:1200/Contacts/contacts/Index

The structure of my application looks like:

enter image description here

Here inside ContactsAreaRegistration.cs file we are having following code:

public class ContactsAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Contacts";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Contacts_default",
                "Contacts/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "MvcApplication1.Areas.Contacts.Controllers" }
            );
        }
    }

Hope it will help you. If you need I can send sample application code which I have created. Thanks.

like image 175
Snesh Avatar answered Oct 28 '22 23:10

Snesh