Ответ 1
_ViewStart
- это не то, что мы (в настоящее время) поддерживаем, но Layout
определенно поддерживается для каждого представления
Я просто разбираюсь с Нэнси, используя текущую сборку на 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"];
}
}
_ViewStart
- это не то, что мы (в настоящее время) поддерживаем, но Layout
определенно поддерживается для каждого представления
Начиная с версии Nancy v0.20 теперь поддерживается файл _ViewStart.
В качестве подсказки, ссылаясь на ваш файл макета, не префикс местоположения с ~/
. Просто выполните следующие действия или вы получите нулевые ссылочные исключения.
@{
Layout = "Views/Shared/_Layout.cshtml";
}
Из того, что я могу сказать, простой ответ был бы не таким.
Более подробный ответ, из ограниченного исследования, которое я сделал.
В 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, поэтому я не знаю, планируют ли они изменить просмотр или нет.
Я хотел добавить к ответу, потому что я потерял около дня, пытаясь понять это:
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, даже если вы внедрили макет в своем представлении.