2010-05-03 72 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

相关问题