带有F#中可选参数的MVC控制器

时间:2014-09-16 17:14:19

标签: asp.net-mvc f# ninject

我相应地使用可选参数创建控制器:

type ProductController(repository : IProductRepository) =
inherit Controller()
member this.List (?page1 : int) = 
    let page = defaultArg page1 1

当我开始申请时,它给了我错误: “ System.MissingMethodException:没有为此对象定义无参数构造函数。

我从依赖注入中知道这个错误,这是我的Ninject设置:

static let RegisterServices(kernel: IKernel) =
    System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver <- new NinjectResolver(kernel)

    let instance = Mock<IProductRepository>()
                    .Setup(fun m -> <@ m.Products @>)
                    .Returns([
                                new Product(1, "Football", "", 25M, "");
                                new Product(2, "Surf board", "", 179M, "");
                                new Product(3, "Running shoes", "", 95M, "")
                    ]).Create()

    kernel.Bind<IProductRepository>().ToConstant(instance) |> ignore

    do()

问题是当我从控制器中删除我的可选参数时,一切正常。当更改常规的参数时,它会给我以下错误: 参数字典包含非可空类型'System.Int32'的参数'page'的空条目,用于'FSharpStore.WebUI.ProductController'中的方法'System.Web.Mvc.ViewResult List(Int32)'。可选参数必须是引用类型,可空类型,或者声明为可选参数。 参数名称:参数

这是我的路线设置:

static member RegisterRoutes(routes:RouteCollection) =
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}")


    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        { controller = "Product"; action = "List"; id = UrlParameter.Optional } // Parameter defaults
    ) |> ignore

有没有人为控制器做过可选参数?我正在为我的同事开展试点项目,以便将F#推广到我们的堆栈。感谢

1 个答案:

答案 0 :(得分:4)

另一个F# - C#interop pain:P

F#可选参数是F#调用者的有效可选参数,但在C#中,此参数将是FsharpOption<T>个对象。

在您的情况下,您必须使用Nullable<T>。所以,代码看起来像:

open System.Web.Mvc
open System
[<HandleError>]
type HomeController() =
    inherit Controller()    
    member this.Hello(code:Nullable<int>) =        
        this.View() :> ActionResult