30

3つの異なるエリアを持つMVCアプリケーションを作成しました。(管理者、ユーザー、ニュース)これはApp_Startディレクトリにある私のRouteConfig.csファイルです。

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[] { "TestMvcApplication.Controllers" }
        );
    }
}

そしてこれは私のAdminAreaRegisteration.csファイルです:

    namespace TestMvcApplication.Areas.Admin
{
    public class AdminAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Admin";
            }
        }

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

そして最後に、これは私のGlobal.asax.csファイルの内容です。

namespace TestMvcApplication
{
    // 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);
            AuthConfig.RegisterAuth();
        }
    }
}

私のウェブサイトのホームページが完全に読み込まれ、動作しています。しかし、管理者または他のエリアのホームページがルートで検出されないため、次のエラーメッセージが表示されました。

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: /Admin/Home

どうすればこの問題を解決できますか?ありがとう。

4

3 に答える 3

29

AreaRegistration.RegisterAllAreas()あなたのどこかに電話してくださいRegisterRoutes

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

ヒント:RouteDebugger2.0RoutingDebuggerなどのツールを使用してルートを調査します

最新のNuGetを入手: MVCの場合はRoute Debugger、 WepApiの場合はRouteDebugger

これは、WebApiでRouteDebuggerを設定して使用する方法に関するチュートリアルです。

于 2012-11-19T13:44:34.623 に答える
22

提供されたコードから、2つの潜在的な問題を確認できます。

  1. RegisterAllAreasを呼び出していません
  2. AreaNameプロパティを上書きしていないようです

コードを次のように変更してみてください。

Global.asax

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 },
        namespaces: new[] { "TestMvcApplication.Controllers" }
    );
}

管理エリア

public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Admin";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}
于 2012-11-19T13:53:06.110 に答える
5

ここで静的メソッドRegisterAreas()を使用してAreaConfigという静的クラス名を作成するだけです。

public static class AreaConfig
{
    public static void RegisterAreas()
    {
        // 
        // Admin area . . .

        var adminArea = new AdminAreaRegistration();
        var adminAreaContext = new AreaRegistrationContext(adminArea.AreaName, RouteTable.Routes);
        adminArea.RegisterArea(adminAreaContext);


        // 
        // Default area . . .

        var defaultArea = new DefaultAreaRegistration();
        var defaultAreaContext = new AreaRegistrationContext(defaultArea.AreaName, RouteTable.Routes);
        defaultArea.RegisterArea(defaultAreaContext);
    }
}

次に、次のようにGlobal.asax.csファイルで呼び出します。

protected void Application_Start()
    {
        . . .

        AreaConfig.RegisterAreas();

        . . .
    }
于 2013-05-23T23:21:53.700 に答える