C# Nancy使用Razor视图自宿主空白响应 以南希0.6解决

C# Nancy使用Razor视图自宿主空白响应 以南希0.6解决,c#,razor,nancy,C#,Razor,Nancy,我试图让自主持的Nancy返回razor视图,但我无法让它工作。Nancy源代码中的示例使用了一个web项目,但没有说明这是必需的。我试着指定配置部分,但他们再次说“这一步是完全可选的”(斜体是他们的)。通过源代码进行跟踪razor看起来不是一个有效的视图引擎,但我看不出可以在配置或我自己的NancyModule中添加它。。。任何帮助都将不胜感激 当我最终发现他们正在查看views文件夹时,cshtml似乎是一个受支持的扩展,但DefaultViewFactory没有将其与视图引擎关联,因此我

我试图让自主持的Nancy返回razor视图,但我无法让它工作。Nancy源代码中的示例使用了一个web项目,但没有说明这是必需的。我试着指定配置部分,但他们再次说“这一步是完全可选的”(斜体是他们的)。通过源代码进行跟踪razor看起来不是一个有效的视图引擎,但我看不出可以在配置或我自己的NancyModule中添加它。。。任何帮助都将不胜感激

当我最终发现他们正在查看views文件夹时,cshtml似乎是一个受支持的扩展,但DefaultViewFactory没有将其与视图引擎关联,因此我得到空值:

我的代码:

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只是一个html页面,上面写着“你好,世界!”

我发现了问题的一部分,在创建NancyHost时,razor程序集没有加载到我的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
//TinyIoC.TinyIoCContainer.Current.Register();//作品
//RazorViewEngine rve=新的RazorViewEngine();//作品
m_主机=新的NancyHost(m_Uri);
//TinyIoC.TinyIoCContainer.Current.Register();//作品
m_Host.Start();
TinyIoC.TinyIoCContainer.Current.Register();//作品

如果有人想重新写下这个答案并找出一个更干净的方法或更好的解决方案,我会接受这个答案。

我在nancy 0.8.0和Razor上也遇到过类似的问题。我让Nancy、Host.Self和ViewEngine.Razor下载、安装并引用

尽管如此,当编译编译器在Nancy.ViewEngines.Razor中找不到Razor名称空间时(尽管对象浏览器和反射器显示名称空间和类型非常好),我还是执行了所有正常的名称空间引用vodo;清理、移除、添加、pm取消销售、pm安装、手动将DLL移动到垃圾箱、戴上我的幸运编译帽、在我的左肩上吐三次口水等等,但仍然得到了相同的结果。没有将Razor加载到AppDomain

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

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


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

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

所以:将.cshtml文件标记为复制到输出

我不想问,但是您是否添加了对
Nancy.ViewEngines.Razor.dll
的引用?开箱即用,你没有什么特别需要做的。路径也不一定必须在
视图
文件夹中,因为您可以指定相对于root.yesp的路径,但Nancy在将程序集加载到my AppDomain之前扫描了该程序集的视图引擎,并且从未更新其列表。在使用Nancy之前强制加载程序集解决了此问题。很高兴您能解决此问题。出于好奇,您正在使用什么类型的项目,因为听起来您好像没有使用web项目。自托管,实际上是WPF应用程序。这是StackOverflow上关闭的另一个合法、有用的问题。这是您使用Nancy的旧版本引起的问题吗?如果是,请更新问题/答案好吗?:-)我在使用Nancy 0.9版本时遇到了完全相同的问题。如果我在主机之前创建了RazorViewEngine的实例,那么一切都正常。当您在测试项目中使用Nancy.Hosted.Self时,就会出现此问题。在应用程序启动过程或TestObject的ctor中显式注册
RazorViewEngine
,可以解决此问题。(Nancy 0.16.1仍然是这样)这对我来说很有效。可惜这个问题已经结束了。