1

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

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

我拥有的是一个供普通用户使用的 NewsController,但我也想要一个 Admin NewsController,但我不确定如何设置类层次结构和文件夹,以便在添加视图时它们位于正确的位置。

在我添加的 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 上的 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} 目录中创建。

4

2 回答 2

1

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

/Areas
    /Admin
        /Controllers
            NewsController.cs
etc.
于 2010-10-07T02:29:28.500 回答
0

当您尝试为现有的控制器操作创建视图时,它总是在视图的根文件夹中创建。View 的默认路由始终指向 Views 文件夹的根目录。

例如:

 Controllers
     Admin
         AdminController.cs
         HomeController.cs
     HomeController.cs

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

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 中返回视图时未指定视图路径,它将映射到视图的默认位置,如下所示。

Views
    Home
        Index.aspx

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

当您右键单击并在控制器的任何子级别的 ActionResult 上创建视图时,它总是在视图文件夹的根目录上创建到其对应的控制器。

于 2010-10-07T02:28:34.943 回答