2

当我使用默认路由时:

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”,如果有人可以回答这个问题,那么谢谢 - 否则问题得到解答 - 再次感谢钱克斯。

4

2 回答 2

0

好的,当您编辑问题时,我会得到您想要的初始答案。我还创建了简单的解决方案来测试您的问题,它也适用于新闻控制器操作。日期不可能影响路由。但是你需要先检查一下——也许你犯了一些错误。再次检查路由,检查控制器名称,重新输入,检查正确的操作放置在 prpper 控制器中。如果您仍然遇到问题,请为您的问题创建一个小项目并将其放在保管箱或其他我可以获取和测试的地方,因为现在我无法重现您的问题。另外,我正在使用 MVC 3。

于 2012-12-16T00:43:54.157 回答
0

已编辑。如果您希望仍然能够识别要在 URL 中调用的操作,那么您必须指定您的特定操作路由并确保识别操作所在的正确控制器:

routes.MapRoute(
"SpecificAction",
"{action}/{FromDate}/{ToDate}",
new { controller = "ControllerName", id = UrlParameter.Optional } );

routes.MapRoute(
"Default", // 
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
于 2012-12-17T16:54:36.563 回答