MVC 4 Area Routing is not working

北城余情 提交于 2019-12-12 07:47:55

问题


I created an empty MVC4 Application, all things are working fine, after that I add an Area to my Project Named "Moderator". My area routing code is like this:

using System;
using System.Web.Mvc;

namespace EskimoArt.Areas.Moderator
{
    public class ModeratorAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Moderator";
            }
        }

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

And my Global.asx code is like this:

using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace EskimoArt
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

But now I want to access the

> http://localhost/Moderator/Dashboard

It shows an Error Page like this

Server Error in '/' Application.

The resource cannot be found.

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 

Requested URL: /Moderator

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929

回答1:


I had the same problem. You look to App_Start/RouteConfig.cs and add top this code AreaRegistration.RegisterAllAreas();

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

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

Create create Areas/Moderator/Controllers/DashboardController.cs

public class DashboardController : Controller
{
    //
    // GET: /Moderator/Dashboard/

    public ActionResult Index()
    {
        return View();
    }
}

and create

Areas/Moderator/Views/Dashboard/Index.cshtml

You also need to have Web.config in Areas/Moderator/Views/Web.config ...




回答2:


Check the namespace of your controller.

I had moved some code into an area and the namespace was still showing the old location.

ReSharper has a very cool option to fix the namespaces of all files in the folder, project or solution! It is very handy to fix this.




回答3:


Just try to delete content from following directories as mentioned here and rebuild project

C:\Temp C:\Users\%Username%\AppData\Local\Microsoft\VisualStudio C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files Path\To\Your\Project\obj\Debug




回答4:


Just add the "namespace:" named parameter in RegisterRoutes() method of RouteConfig.cs in App_Start folder. And specify the value of "namespace" to the namespace of your controller, within which you want to call action method. In following example i want to call Index() method in Village Controller from root of project.

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

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



回答5:


Make sure that in project properties > Web > Start Action > if a specific page | action | url is defined, it does match with mapped routes.




回答6:


Its better to add

AreaRegistration.RegisterAllAreas();

in global.asax.cs. You must place in following order.

GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

Note one things that RegisterAllAreas() should be after Registering the routes. ie. RouteConfig.RegisterRoutes(RouteTable.Routes); should be before AreaRegistration.RegisterAllAreas(); .I have tried and tested and it worked for me.

For more info: enter link description here



来源:https://stackoverflow.com/questions/19239995/mvc-4-area-routing-is-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!