2011-04-17 83 views
3

我使用.NET 3.5,MVC 2和T4MVC 2.6.42 ...T4MVC - 可選參數處理

我有以下作用:

public virtual ActionResult Index(string id, int page = 1) 

與以下路線:

routes.MapRoute(
    "Products", // Route name 
    "Products/{id}", // URL with parameters 
    new { controller = "Products", action = "Index", id = UrlParameter.Optional, page = UrlParameter.Optional }, // Parameter defaults 
    new string[] { "Web.Controllers" } 
); 

但是,當我嘗試呼叫​​我得到一個「方法沒有超載索引'需要'1'參數」例外。然而,調用MVC.Products.Index()的作品。

因爲它默認爲'1',我不應該忽略「page」參數嗎?

注意:我試過默認頁面參數爲1的路線,沒有工作。

注2:也試過[Optional] Attribute沒有成功。

+0

我們可以看到完整的堆棧跟蹤嗎? – 2011-04-17 19:54:59

+0

@KirkWoll對不起,我設法找到解決方案。顯然,可選參數是一個C#4.0的東西([文檔](http://msdn.microsoft.com/en-us/library/dd264739.aspx)指出VS2010)。奇怪的是,當我在C#3.0中聲明類似的方法時,我沒有遇到編譯器錯誤。 – 2011-04-18 01:38:23

回答

0

就像我在我的柯克沃爾迴應稱以上,顯然,optional parameters aren't supported in C# 3.0

我通過創建一個過載和使用NonAction Attribute解決了這個問題:

[NonAction] 
public ActionResult Index(string id) 
{ 
    return Index(id, 1); 
} 

然後MVC.Products.Index(「富」)的工作就像一個魅力,與任何C#版本。

0

只要讓你的int爲空,它就可以工作。

public virtual ActionResult Index(string id, int? page = 1) 
+0

然後我必須每次都傳遞null,在這種情況下,它幾乎與傳遞默認值相同。其實這是我的第一個方法,但後來我厭倦了調用MVC.Products.Index(「foo」,null)。 – 2011-04-18 01:33:27

+0

,但你可以調用MVC.Products.Index(「foo」) – VinnyG 2011-04-18 13:53:27

+0

顯然不是C#3。 – 2011-04-19 18:31:08

5

雖然你找出錯誤的C#版本的問題,爲了將來的參考有一種這樣做的方法。你可以寫:

MVC.Products.Index().AddRouteValue("id", "anything"); 

這使您可以添加對除了什麼方法調用傳遞個人PARAM值

+0

這是一種方法。我會發布我找到的解決方案(我以前不能這樣做,因爲我必須等待24小時才能發佈對自己問題的答案)。 – 2011-04-19 18:32:35