2011-08-18 41 views
1

返回null我有這樣定義的路由:生成RouteUrl在MVC3在一種情況下

routes.MapRoute("Date", "Date/{year}/{month}/{day}", 
    new { controller = "Date", action = "Index", year = UrlParameter.Optional, 
     month = UrlParameter.Optional, day = UrlParameter.Optional }); 

所以它有3個可選參數,年,月,日。它工作在路由GET請求,下面所有的工作細膩精緻:

http://myhost/myapp/Date 
http://myhost/myapp/Date/2011 
http://myhost/myapp/Date/2011/8 
http://myhost/myapp/Date/2011/8/17 

使用RouteUrl生成鏈接適用於所有的情況下,只有一個除外。

例如,我想要包含年份和月份的鏈接的情況正常工作。我用下面(簡化)代碼,在我看來:

string linkUrl = Url.RouteUrl("Date", 
    new { controller = "Date", year = 2011, month = 8 }, 
    Request.Url.Scheme); 

但其中只有一年是指不工作,返回null的情況下,代碼:

string linkUrl = Url.RouteUrl("Date", 
    new { controller = "Date", year = 2011 }, 
    Request.Url.Scheme); 

所以這一切看起來對我正確。任何線索我做錯了什麼,或如何進一步調試。

回答

2

好吧,看起來這是MVC3中引入的一個已知'問題',但是由於.NET4中的路由問題,因此無法由MVC團隊快速修復。雖然默默地返回null顯然是一個bug,但它不清楚我最初創建的路線是否應該按我想要的方式工作(見下文)。

我發現這個SO Question要求人們用兩個可選參數來複制類似的問題,答案也指this article,它有一個解決方法。

我根據解決方法解決了這個問題,方法是製作多個路由,每個路由只有一個可選參數。

routes.MapRoute(
    "Date-ByDay", // Route name 
    "Date/{year}/{month}/{day}", // URL with parameters 
    new { controller = "Date", action = "Index" } // Parameter defaults 
); 

    routes.MapRoute(
    "Date-ByMonth", // Route name 
    "Date/{year}/{month}", // URL with parameters 
    new { controller = "Date", action = "Index", month = UrlParameter.Optional } // Parameter defaults 
); 

    routes.MapRoute(
    "Date-ByYear", // Route name 
    "Date/{year}", // URL with parameters 
    new { controller = "Date", action = "Index", year = UrlParameter.Optional } // Parameter defaults 
); 

這是值得商榷的我原來的做法是否應該反正工作,例如,如果你錯過了可選的「月」參數,並應原路線生成/ 2011/18網址是什麼?雖然醜陋的'解決方法',當然是更明確你想要的行爲。我會爭辯說,我的原始路線的預期行爲是明確(對我),並且如果我要求一年一天的路線,錯過了本月 - 但我可以看到這可能不是每個人的觀點。但是這個確實在在MVC2中工作。

+0

作爲一個可能的解決方法,那麼只需要一個「日期」參數,然後找出它在控制器代碼中的類型呢? – iain

+0

日期爲字符串?使用/ Date/08-18-2011的URL?也許,但是當瀏覽器要求一年或者年份時,我需要展示一個不同的視圖。不過謝謝。 – iandotkelly

+0

是的,就像那樣(或者沒有空格或斜線)。然後有一些代碼來檢查長度以找出它是什麼,然後建立日期時間? – iain

相關問題