Nancy从F#控制器返回错误的内容类型

时间:2015-01-09 16:12:59

标签: model-view-controller f# nancy razorengine

我使用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源代码并跟踪我提交视图请求时提供的模型。

0 个答案:

没有答案