Неверный ответ Nancy Self Host с представлением Razor

Решено в Нэнси 0,6


Я пытаюсь получить самообслуживаемую Нэнси, чтобы вернуть вид бритвы, и я не могу заставить ее работать. Образец в исходном коде Nancy использует веб-проект, но на котором они есть, не говорит, что это необходимо. Я попытался указать разделы конфигурации, но снова они говорят: "Этот шаг полностью необязателен" (курсив мой). Прослеживание через источник не похоже, что бритва является допустимым механизмом просмотра, но я не вижу, где я могу добавить его либо в конфиг, либо в свой собственный NancyModule... Любая помощь будет оценена.

View Engines

Когда я, наконец, выяснил, что они ищут в папке представлений, кажется, что cshtml является поддерживаемым расширением, но DefaultViewFactory не имеет связанного с ним механизма представления, поэтому я получаю null:

enter image description here

Мой код:

public Module1()
{
    Get["/me"] = parms =>
    {
        return View["Static.html"]; // WORKS!
    };
    Get["/you"] = parms =>
    {
        dynamic model = new ExpandoObject();
        //return View["~/Static.cshtml", model];
        //return View["/Static.cshtml", model];
        return View["Static.cshtml", model]; // blank page, no error or anything
    };
}

Static.cshtml - это просто html-страница, в которой говорится: "Привет, мир!"

Ответы

Ответ 1

Консоль, форма и проекты wpf определяют файлы просмотра в том же месте, что и исполняемый файл. это означает, что вы должны скопировать файлы view.cshtml в папку bin\debug проектов, чтобы работать в режиме отладки.
Итак: пометьте ваши .cshtml файлы как копии для вывода

Ответ 2

Я выяснил одну часть моей проблемы: сборка бритвы не была загружена в мой AppDomain, когда я создал свой NancyHost. NancyHost имеет TinyIoc-сканирование и создает список всех классов во всех загруженных сборках, когда он запускается, и этот список никогда не обманывается. Я исправил его, создав RazorViewEngine, чтобы заставить сборку загружаться. Использование вызова Register() также работает, но я думаю, что только потому, что он заставляет сборку загружаться, я думаю, что у Nancy есть свой собственный контейнер. Все эти местоположения работают, но это все еще не работает, если я поместил его в свой NancyModule:

//TinyIoC.TinyIoCContainer.Current.Register<RazorViewEngine>(); // WORKS
//RazorViewEngine rve = new RazorViewEngine(); // WORKS
m_Host = new NancyHost(m_Uri);
//TinyIoC.TinyIoCContainer.Current.Register<RazorViewEngine>(); // WORKS
m_Host.Start();
TinyIoC.TinyIoCContainer.Current.Register<RazorViewEngine>(); // WORKS

Если кто-то захочет перезаписать этот ответ и выяснить более чистый способ или лучшее решение, я приму ответ.

Ответ 3

У меня была похожая проблема с nancy 0.8.0 и Razor. У меня были Nancy, Host.Self и ViewEngine.Razor загружены и установлены, и ссылки.

Однако при компиляции компилятор не смог найти пространство имен Razor в Nancy.ViewEngines.Razor(событие, хотя браузер объектов и рефлектор показал, что пространство имен и типы отлично подходят), я выполнил все нормальные ссылки на пространство имен vodo; чистить, удалять, добавлять, pm неустанавливать, устанавливать время, вручную перемещать dlls в корзину, надеть мою счастливую скомпилированную шляпу, плюнуть три раза на левое плечо и так далее, но все же получило тот же результат. Никакая Razor не загружена в AppDomain...

Я вернул ручную загрузку сборки в appdomain и использовал активатор для создания экземпляра типа RazorViewEngine для контейнера Tiny.IoC factory.

Фактическая проблема заключалась в том, что проект запуска моего решения был нацелен на профиль клиента .NET Framework 4. По-видимому, клиентский пакет .Net не может потреблять и просматривать некоторые части для dll, скомпилированных для полной версии 4.

В любом случае. Изменено мое построение на "нормальный".NET 4, и все возвращается к норме. Компилятор находит типы в пространстве имен, а Tiny.IoC способен подключить все.