2012-12-16 52 views
2

当我使用默认路由:ASP.NET MVC中删除控制器查询字符串操作

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资源未找到错误。

:在课堂上做工精细的其他方法,但是这些要么没有参数或“身份证”,它的唯一的方法就是所谓的与两个日期时间?当我从URL中删除控制器时失败的参数。

感谢您的更新答案,但是我做的唯一更改是从上面的“routes.MapRoute”中删除“{controller} /”文本 - 没有任何拼写错误等的机会,这也是使用MVC 3

进一步:使用Charx的建议:

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

我不再得到一个404错误,但它给了一个“400 - 错误的请求”由于“/” s,因此我将日期格式化为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。

+1

你为什么要删除'{控制器}'从你的映射路线?你是否只想制作一个两层深的网址? – Charx

+0

该网站是非常简单的 - 在网址中的控制器似乎过度,因为将只有一个控制器 - 它不能只是从网址中删除,但仍然用于路由,以确定必要的类? – user1907097

+0

看看我的答案,让我知道如果这对你有用。 – Charx

回答

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 }); 
+0

感谢但WhatIWantURLDirToBe是“没有”,我不想要一个URL目录,但我想要一个似乎上面缺少的动作。当我尝试你的解决方案时,我立即在索引页面获得一个404。 – user1907097

+0

也许我不是很好地解释自己,只有{action}/{id}的路由对于Index以及任何带有“id”参数的方法都非常合适 - 当方法有两个DateTime时,它会生成一个404结果?参数 - 方法之间唯一的区别是DateTime?参数方法导致查询字符串类型“?from = xxxxx&to = xxxxx”,而不是标准的“/ xxxxx”类型的mvc url。当我仅用DateTime去除“{controller} /”方法时,所有方法都可以与“{controller}/{action}/{id}”完美配合使用?参数失败。 – user1907097

+0

没错。解释部分不见了。编辑答案,我希望它越来越接近你所需要的。 – Charx

0

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

+0

为什么不使用MapRoute的最后一个参数指定的控制器,即HomeController? – BlackICE

+0

该网站是非常简单的 - 控制器中的网址似乎是过度的,因为只会有一个控制器 - 它不能只是从网址中删除,但仍然用于路由确定必要的类?问题编辑上面... – user1907097

+0

我更新了我的答案。 – Ph0en1x

相关问题