ASP.NET MVC路由无法正常运行

时间:2018-04-03 16:12:03

标签: asp.net-mvc routing url-routing

我在ASP.NET MVC应用程序中遇到了一些路由问题。

我们假设我有2个控制器:

  1. TaskList Controller
  2. 任务控制器
  3. 我不确定这是否有点过分但我的目标是如下网址:

    对于TaskList Controller:

    • 本地主机:XXXX /任务列表/创建
    • 本地主机:XXXX /任务列表/
    • localhost:xxxx / tasklist / Details / 1
    • 本地主机:XXXX /任务列表/编辑/ 1

    对于任务控制器:

    • 本地主机:XXXX /任务列表/ 1 /任务/创建
    • 本地主机:XXXX /任务列表/ 1 /任务
    • 本地主机:XXXX /任务列表/ 1 /任务/详情/ 11
    • 本地主机:XXXX /任务列表/ 1 /任务/编辑/ 11

    我已按如下方式设置路由:

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}",
                defaults: new { controller = "Home", action = "Index" }
            );
    
            routes.MapRoute(
                name: "TaskListRoute",
                url: "TaskList/{action}/{tasklistid}",
                defaults: new { controller = "TaskList", action = "Index", tasklistid = UrlParameter.Optional }
            );
    
            routes.MapRoute(
                name: "TaskRoute",
                url: "TaskList/{tasklistid}/{controller}/{action}/{taskid}",
                defaults: new { tasklistid = UrlParameter.Optional, controller = "Task", action = "Index", taskid = UrlParameter.Optional }
            );
    

    在调试应用程序时,我能够毫无问题地浏览TaskList控制器,但是当我在任务控制器上点击以下URL时,我得到了一个"无法找到资源"错误:

    http://localhost:xxxx/tasklist/1/Task

    我必须输入单词" Index"如下所示,以便该页面工作... http://localhost:xxxx/tasklist/1/Task/Index

    上述网址背后的方法签名是......

    public class TaskController : Controller
    {
        // GET: Task
        public ActionResult Index(int tasklistid)
        {
            //Some code here....
        }
    }
    

    我错的任何想法?感谢任何建议。

    提前致谢。

1 个答案:

答案 0 :(得分:0)

因此,在考虑了Nkosi的评论和NightOwl888的文章后,我所要做的就是将路由修改为如下所示:

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

        routes.MapRoute(
            name: "TaskRoute",
            url: "TaskList/{tasklistid}/Task/{action}/{taskid}",
            defaults: new { controller = "Task", action = "Index", taskid = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "TaskListRoute",
            url: "TaskList/{action}/{tasklistid}",
            defaults: new { controller = "TaskList", action = "Index", tasklistid = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}",
            defaults: new { controller = "Home", action = "Index" }
        );
    }

基本上做了以下事情:

  • 将路由调整为以下顺序:

    1. TaskRoute
    2. TaskListRoute
    3. 默认
  • 在TaskRoute中,将“{controller}”替换为“任务”等文字 这实际上是控制器的名称。

我希望这是正确的做法。

干杯