我相应地使用可选参数创建控制器:
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#推广到我们的堆栈。感谢
答案 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