首页 文章

ASP.NET MVC F#controller动作忽略参数

提问于
浏览
2

我有一个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:// localhost:56631 / Image / Index / 1

结果出现此错误消息:

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

控制器否则正常工作 . 我知道很多人都写过F#MVC代码,所以任何想法我都会出错?

2 回答

  • 0

    问题是控制器参数的名称需要与映射中指定的名称相匹配,该名称指定如何将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
    );
    

    名称 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框架:-) .

  • 7

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

相关问题