【问题标题】:ASP.NET MVC F# controller action ignoring parameterASP.NET MVC F# 控制器操作忽略参数
【发布时间】:2011-02-14 21:19:51
【问题描述】:

我有一个 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

action的参数貌似被忽略了……

http://localhost:56631/Image/Index/1

导致此错误消息:

参数字典包含参数“i”的空条目 方法的不可空类型“System.Int32” 'System.Web.Mvc.ActionResult 索引(Int32)' 在 'MvcApplication8.Controllers.ImageController'。可选参数 必须是引用类型、可空类型或声明为 可选参数。

Parameter name: parameters

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

【问题讨论】:

  • 我不是 F# 专家,但您能将 i 定义为 UrlParameter.Optional。
  • 恐怕这会给我编译错误。我用谷歌搜索了该类型,它似乎用于路由而不是控制器。

标签: c# .net asp.net-mvc model-view-controller f#


【解决方案1】:

问题在于控制器的参数名称需要与映射中指定的名称匹配,该映射指定如何将 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&lt;int&gt;类型。

对于习惯了 F# 提供的静态类型安全的程序员来说,ASP.NET MVC 依赖于这么多在编译时不检查的动态测试,这有点令人惊讶。我希望有一天,会有一些更好的 F# Web 框架:-)。

【讨论】:

  • 该死!我完全忘记了这一点。我因此确信这是一个与 F# 相关的问题,我忘了回到 ASP.NET MVC 基础知识。非常感谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    相关资源
    最近更新 更多