5

为什么这不起作用?

路线:

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

控制器:

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

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

网址:

http://localhost:40353/Summary/107

错误:

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

更新:

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

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

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

2 回答 2

11

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

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

routes.MapRoute(

    // Route name
    "Default", 

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

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

);

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

  • 如果你访问/,它会调用控制器的Index动作Home;省略了可选的 ID。

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

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

  • 如果您访问/C/A/1它将调用带有 idA的控制器的操作。C1

因此,该路由允许任何形式为/,的 URL /C/C/A并且/C/A/1whereC是控制器和A操作。这是什么意思?这意味着您不必指定自己的路线。

因此,如果没有路由,您可以只使用 aHomeController和 aSummaryController并向最后一个名为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 }
);

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

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

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

于 2012-05-03T17:54:42.487 回答
0

尝试更换:

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

和 :

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

编辑:尝试了您的代码,为我工作。您的 global.asax 中是否定义了任何其他路线?

于 2012-05-03T17:14:25.973 回答