Asp.net mvc 3 在F中设置ViewBag动态对象的属性#

Asp.net mvc 3 在F中设置ViewBag动态对象的属性#,asp.net-mvc-3,f#,razor,Asp.net Mvc 3,F#,Razor,我在C#中有这个动作方法: 以及此视图(Index.cshtml): @ViewBag.Message 这将在页面上生成预期的“Hello” 我想用F#做控制器。我试过了 type MainController() = inherit Controller() member x.Index() = x.ViewBag?Message <- "Hello" x.View() 类型MainController()= 继承控制器() 成员x.索引()= x、 查看包

我在C#中有这个动作方法:

以及此视图(Index.cshtml):

@ViewBag.Message
这将在页面上生成预期的“Hello”

我想用F#做控制器。我试过了

type MainController() =
  inherit Controller()
  member x.Index() =
    x.ViewBag?Message <- "Hello"
    x.View()
类型MainController()=
继承控制器()
成员x.索引()=
x、 查看包?信息而不是

x?ViewBag <- "Hello"

x?ViewBag属性
ViewBag
只是一个包装器,它将
ViewData
集合公开为
dynamic
类型的属性,以便可以从C#动态访问它(使用属性集语法)。您可以使用基于DLR的
实现来实现这一点(请参见),但定义直接将数据添加到
ViewDataDictionary
运算符更容易(该运算符由
ViewData
属性公开):


let(?仅提供一个类似的示例,使用以下控制器方法:

public IActionResult Welcome(string name, int numTimes = 1)
{
    ViewData["Message"] = "Hello " + name;
    ViewData["NumTimes"] = numTimes;

    return View();
}
转换为F#:


#Tomas在适当的时候给予赞扬,我使用您的F#空Web模板(如中所述)在一分钟内生成了此代码(但问题确实出现在实际项目中)。我还需要为TempData提供此代码,因此将第一个参数更改为
(dictionary:IDictionary)
你能详细说明F#如何知道在哪里拆分运算符吗?有
(这不是一个通用功能-F#编译器处理
)似乎很奇怪。谢谢。我已经这样做了,但它仍然会生成“找不到方法或对象构造函数'op#u dynamicasignment'。我已经编辑了这个问题以包含这个建议。
x?ViewBag <- "Hello"
x.ViewBag?Message  <- "Hello"
let (?<-) (viewData:ViewDataDictionary) (name:string) (value:'T) =
  viewData.Add(name, box value)
x.ViewData?Message <- "Hello"
public IActionResult Welcome(string name, int numTimes = 1)
{
    ViewData["Message"] = "Hello " + name;
    ViewData["NumTimes"] = numTimes;

    return View();
}
member this.Welcome (name : string, num_times : int) =
    this.ViewData.Add("Message", box ("Hello " + name))
    this.ViewData.Add("NumTimes", box num_times)

    this.View()