10

我正在使用 Nuget 上的当前版本 v0.12.1.0 来了解 Nancy,我想使用 Razor 视图引擎。

Razor 视图引擎 v0.12.1.0 是否支持 Layout 和 _ViewStart?

例如

我有以下内容~/Views/_ViewStart.cshtml

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

以及以下内容~/Views/Shared/_Layout.cshtml

@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>
<!DOCTYPE html>
<html>
<head>
    @RenderSection("head", false)
</head>
<body>
    @RenderBody()
</body>
</html>

但是当我点击主页时,我得到的只是我设置的视图的内容~/Views/Home/Index.cshtml

<h1>Home</h1>

我的主页模块如下所示:

public class Home : NancyModule
{
    public Home()
        : base("")
    {
        Get["/"] = _ => View["Index"];
    }
}
4

4 回答 4

28

从 Nancy v0.20 开始,现在支持 _ViewStart 文件。

作为提示,在引用您的布局文件时,不要在位置前面加上~/. 只需具有以下内容,否则您将获得空引用异常。

@{
    Layout = "Views/Shared/_Layout.cshtml";
}
于 2014-01-08T22:41:40.737 回答
8

_ViewStart不是我们(目前)支持的,但Layout绝对支持按次观看

于 2012-10-15T20:22:55.780 回答
2

据我所知,简单的答案是否定的。

一个更详细的答案,来自我所做的有限研究。

在 MVC 2 中,Microsoft 添加了一个 System.Web.Razor dll,其中包含 Razor 解析器和代码生成器。_ViewStart 功能是在 MVC 3 中添加的,在该版本中,Microsoft 没有创建新的 System.Web.Razor dll。相反,他们将新的解析器和代码生成器嵌入到 System.Web.Mvc.Razor 命名空间下的新 System.Web.Mvc dll 中。我不确定这种变化背后的原因,也许是为了简化部署。

Nancy Razor 视图引擎引用了原始的 razor 解析器和代码生成器,因此无法访问 MVC 3 中 Razor 的任何新功能。我没有与 NancyFx 人员进行任何讨论,也没有看到(之后快速搜索)GitHub上的任何问题或谷歌组中的讨论,所以我不知道他们是否打算改变视图引擎。

于 2012-10-15T19:53:54.870 回答
2

我想补充一下答案,因为我花了大约一天的时间试图弄清楚这一点:。

Nancy.RequestExecutionException: Oh noes! ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Nancy.ViewEngines.DefaultViewCache.GetOrAdd[TCompiledView](ViewLocationResult viewLocationResult, Func`2 valueFactory)
   at Nancy.ViewEngines.Razor.RazorViewEngine.GetOrCompileView(ViewLocationResult viewLocationResult, IRenderContext renderContext, Assembly referencingAssembly, Type passedModelType)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute5[T0,T1,T2,T3,T4,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
   at CallSite.Target(Closure , CallSite , RazorViewEngine , ViewLocationResult , IRenderContext , Assembly , Object )
   at Nancy.ViewEngines.Razor.RazorViewEngine.GetViewInstance(ViewLocationResult viewLocationResult, IRenderContext renderContext, Assembly referencingAssembly, Object model)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute5[T0,T1,T2,T3,T4,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
   at Nancy.ViewEngines.Razor.RazorViewEngine.<>c__DisplayClass27.b__26(Stream stream)
   at Nancy.Responses.MaterialisingResponse.PreExecute(NancyContext context)

与 Richard Banks 的回答类似 - Nancy 不会解析 Views/_ViewStart.cshtml 文件中的默认布局路径(即:~/Views/Shared/_Layout.cshtml)。~/ 在 Nancy 的视图解析器中没有被解释。

您可以删除 ~/ 部分,或注释掉默认布局并手动指定每个视图的布局。我做后者的原因是,即使您已取消视图中的布局,Nancy 仍会执行 _Layout.cshtml。

于 2014-10-19T03:02:33.787 回答