【问题标题】:Does Nancy.ViewEngines.Razor v0.12.1.0 support Layout views amd _ViewStart?Nancy.ViewEngines.Razor v0.12.1.0 是否支持布局视图和 _ViewStart?
【发布时间】:2014-10-19 11:02:33
【问题描述】:

我刚刚开始了解 Nancy,使用 Nuget 上的当前版本 v0.12.1.0,我想使用 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"];
    }
}

【问题讨论】:

    标签: razor nancy


    【解决方案1】:

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

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

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

    【讨论】:

    • 当使用视图作为嵌入式资源时,这似乎不起作用
    • 希望我没有看到它,但这确实应该在 Nancy 的文档中!我为此苦苦挣扎了几个小时,却不知道为什么在部署我的网站时我的布局路径不起作用。
    • @Maciek 对于 Nancy 1.4.3,它确实可以作为嵌入式资源使用。只需确保_ViewStart.cshtml 的构建属性设置为“嵌入式资源”即可。
    【解决方案2】:

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

    【讨论】:

    • 现在支持_ViewStart
    【解决方案3】:

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

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

    在 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 上的任何问题或 google 组中的讨论,所以我不知道他们是否打算更改视图引擎。

    【讨论】:

      【解决方案4】:

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

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-07
        • 2019-10-14
        相关资源
        最近更新 更多