Поддерживает ли Nancy.ViewEngines.Razor v0.12.1.0 представления макета amd _ViewStart?

Я просто разбираюсь с Нэнси, используя текущую сборку на Nuget, v0.12.1.0, и я бы хотел использовать механизм просмотра Razor.

Поддерживает ли v0.12.1.0 механизма просмотра Razor макет и _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>

Модуль My Home выглядит следующим образом:

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

Ответ 1

_ViewStart - это не то, что мы (в настоящее время) поддерживаем, но Layout определенно поддерживается для каждого представления

Ответ 2

Начиная с версии Nancy v0.20 теперь поддерживается файл _ViewStart.

В качестве подсказки, ссылаясь на ваш файл макета, не префикс местоположения с ~/. Просто выполните следующие действия или вы получите нулевые ссылочные исключения.

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

Ответ 3

Из того, что я могу сказать, простой ответ был бы не таким.

Более подробный ответ, из ограниченного исследования, которое я сделал.

В MVC 2 Microsoft добавила DLL System.Web.Razor, содержащую анализатор Razor и генератор кода. Функция _ViewStart была добавлена ​​в MVC 3, и в этой версии Microsoft не создала новую dll System.Web.Razor. Скорее, они встроили новый синтаксический анализатор и генератор кода в новую DLL System.Web.Mvc в пространстве имен System.Web.Mvc.Razor. Я не уверен в причинах этого изменения, возможно, для упрощения развертывания.

Рецензент Nancy Razor ссылается на исходный анализатор и генератор кода бритвы и поэтому не сможет получить доступ к какой-либо новой функциональности Razor в MVC 3. У меня не было никаких обсуждений с парнями 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)

Как и Ричард Бэнкс, ответьте: Нэнси не разрешает путь макета по умолчанию в вашем файле Views/_ViewStart.cshtml(т.е.: ~/Views/Shared/_Layout.cshtml). ~/Не интерпретируется в представлении в Нэнси.

Вы можете либо удалить ~/part, либо закомментировать макет по умолчанию, и вручную указать макет для каждого из ваших представлений. Причина, по которой я делал последнее, состояла в том, что Nancy все еще выполняет _Layout.cshtml, даже если вы внедрили макет в своем представлении.