2010-05-03 67 views
2

我有一個C#ASP.NET MVC的項目,但我的控制器都寫在F#。ASP.NET MVC F#控制器動作忽略參數

出於某種原因,下面的代碼不能正常工作:

namespace MvcApplication8.Controllers 

open System.Web.Mvc 

[<HandleError>] 
type ImageController() = 
    inherit Controller() 

    member x.Index (i : int) : ActionResult = 
    x.Response.Write i 
    x.View() :> ActionResult 

動作的參數就好像忽略了......

http://localhost:56631/Image/Index/1

結果此錯誤消息:

參數字典包含 的空項,用於方法 的非空可選類型'System.Int32' 'MvcApplication8.Controllers.ImageController'的'System.Web.Mvc.ActionResult索引(Int32) 。一個可選參數 必須是引用類型,可空類型,或聲明爲 可選參數。

Parameter name: parameters 

控制器,否則正常工作。我知道很多人寫了F#MVC代碼,所以我有什麼想法會出錯?

+0

我不是F#專家,但你可以定義我是UrlParameter.Optional。 – 2010-05-03 01:04:36

+0

這給了我編譯錯誤,我害怕。我GOOGLE了這種類型,它似乎是用於路由而不是控制器。 – 2010-05-03 01:10:43

回答

7

的問題是控制器的參數的名稱必須匹配指定如何翻譯網址到控制器調用映射指定的名稱。

如果你看看Global.asax.cs文件(你應該能夠轉化爲F#太),那麼你會看到這樣的事情:

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", 
      id = UrlParameter.Optional } // Parameter defaults 
); 

名稱id指定參數的預期的名稱,所以你需要調整F#代碼,以一個名爲id這樣的參數:

member x.Index(id:int) = 
    x.ViewData.["Message"] <- sprintf "got %d" id 
    x.View() :> ActionResult 

,如果你想使參數可選,您可以使用Nullable<int>類型。

對於過去由F#提供的靜態類型安全的程序員,實在有些令人驚訝的是ASP.NET MVC依賴於未在編譯時檢查這麼多的動態測試。我希望有一天,F#會有一些更好的Web框架:-)。

+0

當它!我完全忘記了這一點。所以我相信,這是一個F# - 相關問題,我忘了回去的ASP.NET MVC基礎。 非常感謝! – 2010-05-03 01:31:05

0

什麼是你的路線是什麼樣子?它是路由到ID?在這種情況下,我重新命名爲ID

+0

就是這樣 - 謝謝! – 2010-05-03 01:32:41

相關問題