2012-12-16 91 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

相關問題