在Nancy中从非文件源渲染视图

时间:2014-01-19 21:37:02

标签: nancy

我有一个相当典型的Nancy配置,视图是从文件系统上的位置提供的。

在特定路线下,我希望提供未存储在文件系统中的视图,但将以外部服务的Markdown格式提供。

我最初通过考虑为IViewLocationProvider创建自定义具体类来解决这个问题,该类将处理从外部服务查找视图的问题。通过我对Nancy的理解(我可能在这里错了),你只能有一个IViewLocationProvider,所以添加这个自定义类意味着我无法获得其余页面(对于我所有的其他路径)文件系统。

我现在的方法是手动调用Nancy.ViewEngines.Markdown.Render方法,将其传递给Markdown(封装在Func<TextReader>中)和假ViewLocationResult。如此:

public class MyModule
{
    public MyModule(ExternalServiceAdapter externalService, MarkDownViewEngine viewEngine, IRenderContext renderContext) : base("/MyPath")
    {
        Get["/{Name}/{Version}/View"] = parameters => SpecialView(viewEngine, renderContext, externalService, (string)parameters.Name, (string)parameters.Version);
    }


    protected static Response SpecialView(MarkDownViewEngine viewEngine, IRenderContext renderContext, ExternalServiceAdapter externalService, string name, string version)
    {
        var contents = externalService.GetData(name, version);            
        var location = new ViewLocationResult(string.Empty, string.Empty, "md", contents);
        return viewEngine.RenderView(location, null, renderContext); //FIXME fails when performing Master page substitution in Super Simple View Engine
    }
}

不幸的是,Markdown包含一个SSVE @Master['master']标记,该标记会导致上述内容在指定行下降,并且在SSVE内部具有空引用异常。 (我在文件系统上有一个名为 master 的文件,并且在Nancy的视图默认路径约定中 - 但我认为不存在导致问题的文件)

有没有更好的方法从markdown渲染Nancy视图,而不是位于文件系统上? (但为其他路由维护文件系统提供程序)

0 个答案:

没有答案