我使用F#Nancy应用程序Visual Studio扩展程序编写了一个F#Nancy应用程序。在我尝试将一个模型对象传递给视图之前,所有人都一直在使用C#Razor View进行渲染。以下是我的控制器:
namespace AspNetHost1
open Nancy
open Models
type IndexModule() as self =
inherit NancyModule()
do
self.Get.["/"] <- fun _ -> self.Index()
self.Get.["/Home"] <- fun _ -> self.Home()
member self.Index() =
self.View.["index.cshtml"] :> obj
member self.Home() =
let login = new Login()
login.UserName <- "Francis"
self.View.["Home.cshtml", login] :> obj
Login
类定义为:
type Login (userName: string) =
let userName = userName
new() = new Login("")
member val LoginId = 0 with get, set
member val UserName = userName with get, set
member val PasswordHash = "" with get, set
member val IsActive = true with get, set
我使用VS 2013社区版,但我不认为这有所不同,而且它是一个带有F#3的.NET 4.5项目。
索引视图工作正常,但Home视图从Razor编译器中提供CS1001编译错误。我是否引用模型对象。一旦我使用其他重载来创建视图,一切都会再次编译。有证据表明它试图将我的模型作为Json返回。
有没有人有类似的经历,或者知道我做错了什么?
更新
在沮丧地离开这一段时间之后,我昨天又回到了它,虽然它是否与F#类有关。
首先,我尝试将模型设为一个简单的字符串,并且它有效!然后我决定在解决方案中添加一个C#项目,并从Nancy F#Web项目中引用它,然后使用它 - 它有效!
我甚至可以在我的F#存储库中使用它,从数据库中检索它并将其传回F#选项中!所以我使用JetBrain的dotPeek查看了来自两个DLL的反编译源代码,看看我是否能看到任何差异。并且,在玩了一会儿看看我可以改变之后,我得出结论,唯一的区别是F#类的自动插入属性:
[CompilationMapping(SourceConstructFlags.ObjectType)]
因此,如果我使用C#实体,我可以使用Razor View。我无法工作的一件事是Razor找到我的模型课,如果我把它作为一个强类型的视图!
我的下一个停靠点是查看Nancy源代码并跟踪我提交视图请求时提供的模型。