Asp.net mvc 2 ASPNET MVC:如何将位于给定区域(相对于根结构)的页面设为默认页面?

Asp.net mvc 2 ASPNET MVC:如何将位于给定区域(相对于根结构)的页面设为默认页面?,asp.net-mvc-2,asp.net-mvc-routing,asp.net-mvc-areas,Asp.net Mvc 2,Asp.net Mvc Routing,Asp.net Mvc Areas,如何以及在何处配置我的应用程序,以便在启动时,操作(因此要显示的页面)不在根结构中,而是在我选择的给定区域中 比如说,Action=“IndexOfArticles”,Controller=“Articles”,Area=“News”。我希望在启动应用程序时将此设置设为默认设置 我已经使用了NewsAreaRegistration类并设置了上述配置。现在我怀疑,为了让它工作,我还需要用Global.asx.cs做些什么,但我不知道该怎么做 编辑 这就是我的意思 routes.MapRoute(

如何以及在何处配置我的应用程序,以便在启动时,操作(因此要显示的页面)不在根结构中,而是在我选择的给定区域中

比如说,Action=“IndexOfArticles”,Controller=“Articles”,Area=“News”。我希望在启动应用程序时将此设置设为默认设置

我已经使用了NewsAreaRegistration类并设置了上述配置。现在我怀疑,为了让它工作,我还需要用Global.asx.cs做些什么,但我不知道该怎么做

编辑

这就是我的意思

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
例如,上面的代码将导致应用程序从位于控制器中的索引操作开始执行。那不是我想要的。
感谢您的帮助。

到您所在地区的自定义路线应在您的区域注册类中注册,而不是在Global.asx.cs中注册

要添加路由,请修改您的
新闻区域注册
,并在区域路由之后将新的默认路由添加到服务器。(这里的顺序很重要!)

默认路由应始终位于路由表的底部,以便可以匹配更具体的路由

RegisterArea
方法中的路由应如下所示:

        context.MapRoute(
            "News_default",
            "News/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );

        context.MapRoute(
            "DefaultStart",
            "",
            new { controller = "Articles", action = "IndexOfArticles"}
        );
更新:忘记提及您需要确保在Global.asx.cs文件中的
应用程序启动
方法中注册您的区域

AreaRegistration.RegisterAllAreas();

更新2:ASP.NET MVC中的路由工作原理

我理解你的担心。让我简单解释一下路由是如何工作的

在ASP.NET MVc中,有一个用于匹配所有url请求的路由表

当您在Global.asx.cs或Area Registration中注册路由时,这些路由将按其注册的顺序添加到路由表中(这就是为什么订单很重要,我们应该将更具体的路由推到顶部,以便它们可以匹配)

涉及区域路线时(在
AreaRegistration
类中注册的路线)。在Global.asx.cs文件中注册的任何路由(区域路由是第一个要匹配的路由)之前,这些路由始终添加到路由表的顶部,因为否则您将无法匹配名为News的控制器的名为News的区域

如果您有多个区域,首先检查哪个区域的路线?我不是100%确定,但通过实验我发现它们是按创建时间排序的,旧区域在路由表的顶部排在第一位。(这并不重要,因为您不会有两个同名区域)

示例:

假设您已经创建了以下区域<代码>新闻,
仪表板
Api

并将以下路由添加到NewsArea注册中,以与上面示例中的根路由匹配

context.MapRoute(
        "DefaultStart",
        "",
        new { controller = "Articles", action = "IndexOfArticles"}
    );
您的路由表将如下所示:

No   Route Name                        URL                               Explanation 
1   News_default         News/{controller}/{action}/{id}          Default For News Area
2   DefaultStart         (empty)                                  Root Route (match root url)
3   Dashboard_default    Dashboard/{controller}/{action}/{id}     Default For Dashboard Area
4   Api_default          Api/{controller}/{action}/{id}           Default For Api Area
5   Default              {controller}/{action}/{id}               Default (No Areas)
routes.MapRoute(    
     "Default",  
     "{controller}/{action}/{id}",  
     new { controller = "Home", action = "Index", id = UrlParameters.Optional }  
); 
routes.MapRoute(
    "Default",
    "{controller}/{acion}/{id}",
    new {controller = "Articles", action = "IndexOfArticles", id = UrlParameters.Optional},
    new[] {"YourApplication.News"}
);
现在,当应用程序收到请求时。它将一个接一个地穿过路线,寻找匹配的路线。在我们的例子中,当您请求根url时。第二条路线将匹配。由于我们为controller=“Articles”和action=“IndexOfArticles”设置了默认值,因此请求将相应地重定向


希望这会有帮助。

考虑到您提出的问题的性质,我想推荐一个我认为您会非常喜欢的资源。Steven Sanderson的书《Pro ASP.NET MVC 2框架(第二版)》,作者:apress。第8章特别详细介绍了路线和区域。这本书本身很好,很有思想性;我读过的最好的开发/编程书籍之一。它以Kindle的形式提供,如果您直接从apress订购,您可以以PDF电子书的形式获得。当然,它也以纸质形式提供:

关于区域,您可能需要了解的具体情况是它们基于名称空间。当您创建一个区域时,该区域的名称空间是MVC定位它们的方式,并决定什么是“在”和什么不是。一般来说,这意味着通过URL将区域名称作为URL中的第一个文件夹来路由到区域,但这会映射到控制器的命名空间,而不一定是物理文件夹名称(尽管如果您希望保持理智,它们应该匹配)

Manaf例子中的路线是“偶然”而不是故意的,这可能就是为什么你不能完全理解它的作用。“根区域”(即不在某个区域中的控制器文件夹)中存在控制器名称不明确的问题。对于指向根区域的路由,但在那里找不到控制器,它将扫描所有区域以查找匹配项。在本例中,它会在您的新闻名称空间中找到匹配项,并正常工作。但是,只有当只有一个控制器匹配时,这种扫描才起作用。因此,如果要在另一个区域中使用相同的名称创建另一个控制器,它将失败,出现“找到多个类型”的异常

有两种方法可以让这项工作更可靠。通过对路由中的新闻区域进行优先级排序,或通过重定向:

重定向:

您可以将浏览器重定向到要启动请求的区域的URL,而不是将根请求路由到特定区域中的控制器。因此,它们从“yoursite.com/”开始,将被重定向到“yoursite.com/news/articles”URL。为此,请创建根级别控制器并使用默认路由。因此,在根控制器文件夹中创建HomeController(而不是在区域中)。在该控制器上创建一个名为Index的操作方法。在该索引方法中,将它们重定向到您真正希望它们启动的控制器

全球
routes.MapRoute(
    "Default",
    "{controller}/{acion}/{id}",
    new {controller = "Articles", action = "IndexOfArticles", id = UrlParameters.Optional},
    new[] {"YourApplication.News"}
);