ASP.NET MVC删除了控制器QueryString操作

时间:2012-12-16 00:24:39

标签: c# asp.net-mvc asp.net-mvc-routing

当我使用默认路线时:

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}) %>

但是当我尝试使用以下内容从网址中删除控制器时:

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被认为是空的。

最终:我将两个日期的类型更改为字符串,并将它们转换为方法中的日期时间 - 现在两个参数都很好 - 我猜它可能正在寻找时间元素第一个参数因此忽略了第二个参数。

现在唯一优秀的事情是,现在需要“id”参数的方法似乎将它用作查询字符串(NewsEnrty?ID = 5)而不是“NewsEntry / 5”,如果有人可以回答这个问题,那么谢谢 - 否则回答问题 - 再次感谢Chanx。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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 } );