16

在南希 0.6 中解决


我试图让自托管南希返回一个剃刀视图,但我无法让它工作。Nancy 源代码中的示例使用了一个 Web 项目,但他们拥有的页面并没有说这是必需的。我试过指定配置部分,但他们又说“这一步是完全可选的”(斜体是他们的)。追踪源代码,它看起来不像 razor 是一个有效的视图引擎,但我看不到可以在配置中或我自己的 NancyModule 中添加它的位置......任何帮助将不胜感激。

查看引擎

当我最终发现他们正在查看视图文件夹时,似乎 cshtml 是受支持的扩展,但 DefaultViewFactory 没有将它与视图引擎关联,所以我得到 null:

在此处输入图像描述

我的代码:

public Module1()
{
    Get["/me"] = parms =>
    {
        return View["Static.html"]; // WORKS!
    };
    Get["/you"] = parms =>
    {
        dynamic model = new ExpandoObject();
        //return View["~/Static.cshtml", model];
        //return View["/Static.cshtml", model];
        return View["Static.cshtml", model]; // blank page, no error or anything
    };
}

Static.cshtml 只是一个显示“Hello, world!”的 html 页面。

4

3 回答 3

10

控制台、表单和 wpf 项目将视图文件定位在与可执行文件相同的位置。这意味着您必须将 view.cshtml 文件复制到项目的 bin\debug 文件夹才能在调试模式下工作。
所以:将您的 .cshtml 文件标记为复制到输出

于 2011-10-12T05:15:58.423 回答
3

我发现了我的问题的一部分,当我创建我的 NancyHost 时,剃刀程序集没有加载到我的 AppDomain 中。NancyHost 有 TinyIoc 扫描并在启动时创建所有加载程序集中的所有类的列表,并且此列表永远不会被更新。我通过创建 RazorViewEngine 来强制加载程序集来修复它。使用 Register() 调用也可以,但我认为只是因为它强制加载程序集,我认为 Nancy 有自己的容器。所有这些位置都有效,但如果我把它放在我的 NancyModule 中它仍然不起作用:

//TinyIoC.TinyIoCContainer.Current.Register<RazorViewEngine>(); // WORKS
//RazorViewEngine rve = new RazorViewEngine(); // WORKS
m_Host = new NancyHost(m_Uri);
//TinyIoC.TinyIoCContainer.Current.Register<RazorViewEngine>(); // WORKS
m_Host.Start();
TinyIoC.TinyIoCContainer.Current.Register<RazorViewEngine>(); // WORKS

如果有人想重新编写此答案并找出更清洁的方法或更好的解决方案,我会接受答案。

于 2011-07-15T01:31:34.033 回答
1

我在使用 nancy 0.8.0 和 Razor 时遇到了类似的问题。我下载并安装并引用了 Nancy、Host.Self 和 ViewEngine.Razor。

仍然在编译编译器时在 Nancy.ViewEngines.Razor 中找不到 Razor 命名空间(尽管对象浏览器和反射器显示命名空间和类型非常好),我做了所有正常的命名空间引用 vodo;清理,删除,添加,pm unstall,pm install,手动将 dll 移动到 bin,戴上我的幸运编译帽,在我的左肩上吐了三下等等,但仍然得到相同的结果。没有 Razor 加载到 AppDomain...

我恢复到手动将程序集加载到 appdomain 并使用激活器为 Tiny.IoC 容器工厂创建 RazorViewEngine 类型的实例。

实际问题是我的解决方案的启动项目是针对 .NET Framework 4 客户端配置文件的。显然,客户端 .Net 包无法使用和查看为完整 4 版本编译的 dll 的某些部分。

无论如何。将我的构建更改为“正常”.NET 4,一切都恢复正常。编译器在命名空间中找到类型,Tiny.IoC 能够连接所有内容。

于 2011-10-10T23:34:39.960 回答