ASP.NET MVC F#控制器操作忽略参数

我有一个C#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://本地主机:56631 /图像/索引/ 1

结果在这个错误消息:

参数字典包含'MvcApplication8.Controllers.ImageController'中方法'System.Web.Mvc.ActionResult Index(Int32)'的非空类型'System.Int32'的参数'i'的空条目。 可选参数必须是引用类型,可为空类型,或者声明为可选参数。

Parameter name: parameters

控制器否则工作正常。 我知道很多人写了F#MVC代码,所以我有什么想法会出错?


问题是控制器参数的名称需要与映射中指定的名称匹配,以指定如何将URL转换为控制器调用。

如果您查看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
);

name 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框架:-)。


你的路线是什么样的? 它是路由到ID? 在这种情况下将我重命名为id

链接地址: http://www.djcxy.com/p/39217.html

上一篇: ASP.NET MVC F# controller action ignoring parameter

下一篇: Send JSON data via POST (ajax) and receive json response from Controller (MVC)