默认路由不起作用

bir*_*dus 5 routing asp.net-mvc-3

为什么这不起作用?

路线:

routes.MapRoute(
                "Summary",
                "{controller}/{id}",
                new { controller = "Summary", action = "Default" }
            );
Run Code Online (Sandbox Code Playgroud)

控制器:

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

            return View("Summary", summary);
        }
    }
Run Code Online (Sandbox Code Playgroud)

网址:

http://localhost:40353/Summary/107
Run Code Online (Sandbox Code Playgroud)

错误:

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
Run Code Online (Sandbox Code Playgroud)

更新:

让我用更聪明的问题更新问题.我怎么能同时拥有这两个?

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

routes.MapRoute(
                    "Summary",
                    "{controller}/{id}",
                    new { controller = "Summary", action = "Default" }
                );
Run Code Online (Sandbox Code Playgroud)

Tam*_*man 11

路由如何工作(默认情况下)?

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

routes.MapRoute(

    // Route name
    "Default", 

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

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

);
Run Code Online (Sandbox Code Playgroud)

让我们试着理解这个是如何工作的.

  • 如果您访问/,它将调用控制器的Index操作Home; 省略了可选的Id.

  • 如果您访问/C它将调用控制器的Index操作C; 省略了可选的Id.

  • 如果您访问/C/A它将调用控制器的A操作C; 省略了可选的Id.

  • 如果您访问/C/A/1它将使用id 调用控制器的A操作.C1

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

因此,如果没有路由,您可以只使用a HomeController和a SummaryController并向最后一个控制器添加操作Show.

然后/Summary/Show/1会打电话SummaryController.Show(1)


如果我想为控制器设置更短的路径(/ Controller/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 }
);
Run Code Online (Sandbox Code Playgroud)

请注意,我们已将Home路线更改为Default路线.现在我们添加了Summary一条路由,告诉我们表单的URL Summary/{id}会触发该路由.当它们这样做时,它调用控制器的Show动作Summaryid作为参数传递; 这正是你想要的......

另请注意,我们需要首先放置Summary路线,使其优先.

警告:您不希望为您创建的每个操作创建新路由.您也不希望所有操作都在同一个控制器中.如果其中一个是这种情况,请考虑重新考虑您的方法,以便您以后不会遇到问题......