使用Admin子站点进行路由的正确过程

时间:2010-10-07 01:47:33

标签: c# asp.net-mvc-2 asp.net-mvc-areas

我正在构建我的第一个Asp.Net MVC2站点,现在我正在尝试向站点添加/ Admin区域。

我不希望此区域对主要用户组具有可见性,因此只有在您输入http://Intranet/Admin时才能访问

我的常规用户是NewsController,但我也想要一个Admin NewsController,我不知道如何设置Class层次结构和文件夹,以便在我添加Views时它们位于正确的位置。

在我的Global.Asax.cs中,我添加了并且路由正确解析。

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
    new string[] { "Intranet.Controllers" } 
);

routes.MapRoute(
    "Admin", // Route name
    "Admin/{controller}/{action}/{id}", // URL with parameters
    new { controller = "Admin", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
      new string[] { "Intranet.Controllers.Admin" } 
);

在我设置的文件夹层次结构中

Views/
     Admin/
     News/
         ...I want the new view to go here...

在控制器中

Controllers/
    Admin/
        AdminController.cs
        NewsController.cs (this is the one i want for administration)
    NewsController.cs (this is the regular one for viewing the list, specific item etc)

我遇到的问题是当我进入Index和Add View的admin / NewsController.cs时,它试图在/News/Index.aspx而不是/Admin/News/Index.aspx创建它。

这是我的管理新闻控制器Controllers / Admin-> Add-> Controller

的代码
namespace Intranet.Controllers.Admin
{
    public class NewsController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

我做错了什么,或者我应该更改什么,以便在我添加视图时在/ Admin / {area}目录中创建它们。

2 个答案:

答案 0 :(得分:1)

由于您正在使用MVC2,解决此问题的最简单方法是为管理员部分创建一个实际的MVC“区域”。现在,您正在默认部分中执行所有操作,只使用Admin文件夹。如果您创建一个管理区域(在众所周知的位置区域下)文件夹,那么您将拥有一个AdminAreaRegistration - 您将在哪里配置您的管理员路线。因为您将作为区域的一部分执行此操作,所以URL“/ Admin”的第一个段将用于“区域”令牌。这将消除使用哪个控制器的歧义,并正确选择您想要的控制器。所以你的文件夹结构将是:

/Areas
    /Admin
        /Controllers
            NewsController.cs
etc.

答案 1 :(得分:0)

当您尝试为现有的Controller Action创建View时,它始终在Views的根文件夹上创建。 View的默认路由始终指向Views文件夹的根目录。

例如:

 Controllers
     Admin
         AdminController.cs
         HomeController.cs
     HomeController.cs

在该层次结构中,Admin和root中的HomeController在视图文件夹中共享相同的视图。

Views
    Home
        Index.aspx

除非您在控制器的管理文件夹内的HomeController中的所有ActionResults中返回指定的View()。它将映射到某个视图。

示例,控制器中Admin文件夹的HomeController.cs内的ActionResult。

namespace Intranet.Controllers.Admin
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View("Home/Index");
        } 
    }
}

这将像这样

映射到Views文件夹中
Views
    Admin
        Home
            Index.aspx

但是如果在ActionResult中返回View时未指定View路径,它将映射到Views的默认位置,如下所示。

Views
    Home
        Index.aspx

这样做的原因是,即使您在Global.asax中指定路由,也只是映射到url应指向的控制器,而不是Views文件夹。

右键单击并在控制器的任何子级别的ActionResult上创建视图时,它始终在Views文件夹的根目录上创建其相应的Controller。