不工作的默认路由(Default route not working)

2019-07-29 06:29发布

Why doesn't this work?

Route:

routes.MapRoute(
                "Summary",
                "{controller}/{id}",
                new { controller = "Summary", action = "Default" }
            );

Controller:

public class SummaryController : Controller
    {
        public ActionResult Default(int id)
        {
            Summary summary = GetSummaryById(id);

            return View("Summary", summary);
        }
    }

URL:

http://localhost:40353/Summary/107

Error:

Server Error in '/' Application.

    The resource cannot be found.

    Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 

    Requested URL: /Summary/107

    Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.225

Update:

Let me update the question with a more intelligent one. How can I have both of these?

routes.MapRoute(
                    "Home",
                    "{controller}",
                    new { controller = "Home", action = "Default" }
                );

routes.MapRoute(
                    "Summary",
                    "{controller}/{id}",
                    new { controller = "Summary", action = "Default" }
                );

Answer 1:

如何路由工作(默认)?

让我们回到默认路由,这有点像这样的:

routes.MapRoute(

    // Route name
    "Default", 

    // URL with parameters
    "{controller}/{action}/{id}", 

    // Parameter defaults
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 

);

让我们试着去了解这一个是如何工作的。

  • 如果访问/ ,它会调用该Index的作用Home控制器; 可选Id被ommitted。

  • 如果访问/C ,它会调用该Index的作用C控制器; 可选Id被ommitted。

  • 如果访问/C/A就会调用A的动作C控制器; 可选Id被ommitted。

  • 如果访问/C/A/1它将调用A的动作C控制器ID为1

所以,该路由允许形式的任何网址//C/C/A/C/A/1 ,其中C是一个控制器和A是一个动作。 这是什么意思? 这意味着,你不一定要指定自己的路线。

所以,没有路线,你可以只是有一个HomeControllerSummaryController并添加一个动作到最后调用控制器Show

然后/Summary/Show/1会叫SummaryController.Show(1)


如果我要什么有一个控制器,一个较短的路线(/控制器/ Id)的?

让我们假设我们要映射的路线,从而/Summary/1调用SummaryController.Show(1)

这是正确的表格:

routes.MapRoute(
    "Summary",
    "Summary/{id}",
    new { controller = "Summary", action = "Show" }
);

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

请注意,我们已经改变了Home路线看起来像Default路径。 现在,我们已经添加了一个Summary的路线,我们告诉形式的URL Summary/{id}将触发这条路线。 当他们这样做时,它调用Show的行动Summary控制器并一起传递id作为参数; 这是你想要什么?

还要注意的是,我们需要把Summary航首次,使得它得到优先。

注意:您不希望创建一个新的路线为您创建的每一个动作。 你也不想自己的行为是在同一个控制器。 考虑重新考虑你的方法,如果其中之一的话,那么你不有问题的最终后...



Answer 2:

尝试更换:

new { controller = "Summary", action = "Default" }

有:

new { controller = "Summary", action = "Default", id = UrlParameter.Optional }

编辑:想你的代码,为我工作。 你有你的Global.asax中定义的任何其它途径?



文章来源: Default route not working