【发布时间】:2018-06-08 17:29:05
【问题描述】:
当我使用默认路由时:
routes.MapRoute(
"Default", //
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
应用程序找到以下方法:
public ActionResult News(DateTime? FromDate, DateTime? ToDate)
{
IList<Model.MonthGroupNewsEntry> monthGroupNewsEntries = new services.NewsEntryService(new Data.SqlNewsEntryRepository()).GetMonthGroupNewsEntries();
IList<Model.NewsEntry> newsEntries = new Services.NewsEntryService(new Data.SqlNewsEntryRepository()).GetNewsEntriesWithinDateRange(FromDate,
return View(new Models.NewsViewModel(monthGroupNewsEntries, newsEntries));
}
发件人:
<%= Html.ActionLink(b.MonthName + " " + b.Year.ToString() + " (" + b.EntryCount.ToString() + ")", "News", new { FromDate = b.FromDate, ToDate = b.ToDate}) %>
但是当我尝试使用以下方法从 url 中删除控制器时:
routes.MapRoute(
"Default",
"{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
我收到 404 资源未找到错误。
注意 : 类中的其他方法工作正常,但这些方法要么没有参数,要么没有“id”,只是用两个 DateTime 调用的方法?当我从 URL 中删除控制器时失败的参数。
感谢更新的答案,但是 - 我所做的唯一更改是从上面的“routes.MapRoute”中删除“{controller}/”文本 - 没有任何拼写错误等的机会,这个也在使用 MVC 3。
进一步:使用 Charx 的建议:
routes.MapRoute(
"SpecificAction",
"{action}/{FromDate}/{ToDate}",
new { controller = "ControllerName", id = UrlParameter.Optional } );
我不再收到 404 错误,但由于日期中的“/”,它给出了“400 - 错误请求”,因此我将日期重新格式化为 dd-MM-YYYY:
<%= Html.ActionLink(b.MonthName + " " + b.Year.ToString() + " (" + b.EntryCount.ToString() + ")", "News", new { FromDate = b.FromDate.ToString("dd-MM-yyyy"), ToDate = b.ToDate.ToString("dd-MM-yyyy")}) %>
它不再是 404,FromDate 被识别得很好,但 ToDate 以空值出现。
Final :我将两个日期的类型更改为字符串,并在方法中将它们转换为 datetime - 现在两个参数都很好 - 我猜它可能是在寻找第一个参数,因此忽略了第二个。
现在唯一突出的是,需要“id”参数的方法现在似乎将其用作查询字符串 (NewsEnrty?ID=5),而不是“NewsEntry/5”,如果有人可以回答这个问题,那么谢谢 - 否则问题已回答- 再次感谢 Chanx。
【问题讨论】:
-
为什么要从映射的路线中删除
{controller}?您是否只想创建一个两级深度 URL? -
该站点非常简单 - 在 url 中包含控制器似乎太过分了,因为永远只有一个控制器 - 它不仅可以从 url 中删除,还可以用于路由以确定必要的类?
-
看看我的回答,让我知道这是否适合你。
标签: c# asp.net-mvc asp.net-mvc-routing