[英]ASP.NET MVC - Nesting Routes / Controllers
我有一个ASP.NET MVC应用程序。 我见过类似的问题。 但是,我还没有找到一个好的答案。 基本上,我想使用以下路由:
/admin/users
/admin/users/create
/admin/users/[someId]
/admin/roles
/admin/roles/create
/admin/roles/[someId]
我有以下文件结构:
/Controllers
AdminController.cs
/Admin
UsersController.cs
RolesController.cs
/Views
/Admin
Index.cshtml
/Users
Index.cshtml
Detail.cshtml
Create.cshtml
/Roles
Index.cshtml
Create.cshtml
Detail.cshtml
当我运行我的应用程序时,我只是得到了The resource cannot be found.
我究竟做错了什么? 我设置了断点,但没有一个被击中。 这就像路由没有映射到控制器。 我不确定我需要做什么。
您无需为此创建子文件夹。 只需要2个控制器( UsersController
和RolesController
),您就可以使用属性路由来定义所需的自定义路由模式。
假设您已启用属性路由
public class UsersController : Controller
{
[Route("admin/users")]
public ActionResult Index() { // to do : Return something }
[Route("admin/users/create")]
public ActionResult Create() { // to do : Return something }
[Route("admin/users/{id}")]
public ActionResult View(int id) { // to do : Return something }
}
或者您可以在控制器级别上执行RoutePrefix
。
[RoutePrefix("admin/users")]
public class UsersController : Controller
{
[Route("")]
public ActionResult Index() { // to do : Return something }
[Route("create")]
public ActionResult Create() { // to do : Return something }
[Route("{id}")]
public ActionResult View(int id) { // to do : Return something }
}
你也可以为RolesControllers做同样的事情。
您可以在RouteConfig.cs
文件的RegisterRoutes
方法中启用属性路由。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes(); //This line enables attribute routing
//Existing default Route definition goes here
}
您也可以考虑创建一个“管理”区域并将控制器置于其中。 如果要对逻辑上的类似功能进行分组,则区域是正确的解决方案。
如果您不喜欢属性路由(为什么不呢?),您可以在RouteConfig中定义这些自定义路由模式。 您定义路线的顺序很重要。因此,请确保在默认通用路线之前定义您的特定路线 。
您还可以通过使用RouteAttribute类修饰操作方法来覆盖路由表。
例如:
class AdminController
{
[Route("/admin/users/create")]
public ViewResult CreateUser()
{
...
}
}
这具有将方法名称与url组件分开的优点。
您还可以将多个URL路由到单个方法:
class AdminController
{
[Route("/admin/users/{someId:guid}")]
[Route("/admin/users/{someId:guid}/details")]
public ViewResult UserDetails(Guid someID)
{
...
}
}
正如梅森所说,文件结构在MVC路由中并不重要。
如果要使用基于约定(文件夹)的路由,可以使用MvcCodeRouting完成您在此处指定的操作。 它默认使用命名空间,因此当您在层次结构中添加控制器时,它将自动生成同一层次结构中的路由。 无需在任何地方应用[Route]
属性并手动设置路线。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.