Nancy.ViewEngines.Razor v0.12.1.0是否支持布局视图amd _ViewStart?

时间:2012-10-15 17:20:42

标签: razor nancy

我正在使用Nuget,v0.12.1.0上的当前构建来处理Nancy,我想使用Razor视图引擎。

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

e.g。

我在~/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 个答案:

答案 0 :(得分:29)

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

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

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

答案 1 :(得分:8)

_ViewStart不是我们(目前)支持的内容,但基于每个视图肯定支持Layout

答案 2 :(得分:2)

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

从我所做的有限研究中得到更详细的答案。

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

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

答案 3 :(得分: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)

与理查德班克斯的答案类似 - 南希没有解析Views / _ViewStart.cshtml文件中的默认布局路径(即:〜/ Views / Shared / _Layout.cshtml)。在Nancy的视图解析器中解释了〜/ isn。

您可以删除〜/ part,也可以注释掉默认布局,并在每个视图上手动指定布局。我做后者的原因是因为Nancy仍然执行_Layout.cshtml,即使你已经在视图中排除了布局。