【问题标题】:ASP.NET MVC Routing not working wellASP.NET MVC 路由无法正常工作
【发布时间】:2018-04-03 16:12:03
【问题描述】:

我的 ASP.NET MVC 应用程序中出现了一些路由问题。

假设我有 2 个控制器:

  1. 任务列表控制器
  2. 任务控制器

我不确定这是否矫枉过正,但我​​的目标是拥有如下 URL:

对于任务列表控制器:

  • localhost:xxxx/tasklist/创建
  • localhost:xxxx/tasklist/
  • localhost:xxxx/tasklist/Details/1
  • localhost:xxxx/tasklist/Edit/1

对于任务控制器:

  • localhost:xxxx/tasklist/1/Task/Create
  • localhost:xxxx/tasklist/1/Task
  • localhost:xxxx/tasklist/1/Task/Details/11
  • localhost:xxxx/tasklist/1/Task/Edit/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

我必须像下面这样输入单词“索引”才能使该页面正常工作... http://localhost:xxxx/tasklist/1/Task/Index

上述url后面的方法签名是……

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

有什么想法我错了吗?感谢任何建议。

提前致谢。

【问题讨论】:

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


【解决方案1】:

所以在考虑了 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. 任务路线
    2. 任务列表路由
    3. 默认
  • 在 TaskRoute 中,将“{controller}”替换为类似“Task”的字面量 这实际上是控制器的名称。

我希望这是正确的做法。

干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2014-05-04
    • 1970-01-01
    • 2016-11-26
    • 2014-12-05
    • 2018-01-17
    • 2017-10-15
    相关资源
    最近更新 更多