为什么这不起作用?
路线:
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);
}
}
URL:
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" }
);
答案 0 :(得分: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
,则会调用标识为A
的{{1}}控制器的C
操作。
因此,该路由允许1
,/
,/C
和/C/A
形式的任何网址,其中/C/A/1
是控制器,{{1}是一个动作。这是什么意思?这意味着您不必必须指定自己的路线。
因此,如果没有路由,您可以拥有C
和A
,并向最后一个名为HomeController
的控制器添加操作。
然后SummaryController
会调用Show
假设我们确实要映射路由,以便/Summary/Show/1
调用SummaryController.Show(1)
。
以下是正确的表格:
/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
控制器的Summary/{id}
操作并传递Show
作为参数;这正是你想要的......
另请注意,我们需要先放置Summary
路线,使其优先。
警告:您不希望为您创建的每个操作创建新路由。您也不希望所有操作都在同一个控制器中。如果其中一个是这种情况,请考虑重新考虑您的方法,以便您以后不会遇到问题......
答案 1 :(得分:0)
尝试更换:
new { controller = "Summary", action = "Default" }
with:
new { controller = "Summary", action = "Default", id = UrlParameter.Optional }
编辑:尝试了您的代码,为我工作。您是否在global.asax中定义了其他路由?