#c# #asp.net #razor #nancy
#c# #asp.net #razor #nancy
Вопрос:
Я новичок в Nancy и пытаюсь настроить веб-приложение с каждым модулем / контроллером в отдельном проекте. Основной проект пуст ASP.NET проект и использует Nancy.Hosting.Aspnet
пакет nuget.
Каков элегантный способ такой настройки?
Допустим, у меня есть следующая структура решения:
/ModuleA
- ModuleA.csproj
- IndexA.cshtml (Copy to Output Directory = Copy Always)
/MainModule (references ModuleA)
- MainModule.csproj
- Index.cshtml
В настоящее время для обслуживания IndexA
представления из ModuleA
мне приходится писать View["bin/IndexA"]
, что кажется довольно уродливым, потому что для этого также потребуется добавить префикс javascript / css таким же образом.
Комментарии:
1. Я не делал этого раньше, но попробуйте добавить в
ResourceViewLocationProvider.RootNamespaces
в вашем загрузчике. Что-то вродеResourceViewLocationProvider.RootNamespaces.Add(typeof(ModuleA).Assembly, "ModuleA");
. Вы могли бы легко перебирать все модули, на которые ссылаются, и добавлять их во время выполнения. Не забудьте зарегистрировать поставщика (NancyInternalConfiguration.ViewLocationProvider
)2. Спасибо, звучит многообещающе! Я попробую это, когда у меня будет возможность.
Ответ №1:
Вам необходимо настроить соглашения nancy в загрузчике. Вот документы nancy:https://github.com/NancyFx/Nancy/wiki/View-location-conventions .
Учитывая эту структуру решения:
/ModuleA
- ModuleA.csproj
- views/IndexA.cshtml (Copy to Output Directory = Copy Always)
- assets/foo.js (Copy to Output Directory = Copy Always)
/MainModule (references ModuleA)
- MainModule.csproj
- Index.cshtml
В MainModule
загрузчике:
public class Bootstrapper : DefaultNancyBootstrapper
{
protected override void ConfigureConventions(Nancy.Conventions.NancyConventions nancyConventions)
{
base.ConfigureConventions(nancyConventions);
// for views in referenced projects
nancyConventions.ViewLocationConventions.Add(
(viewName, model, context) => string.Concat("bin/views/", viewName));
// for assets in referenced projects
nancyConventions.StaticContentsConventions.Add(
Nancy.Conventions.StaticContentConventionBuilder.AddDirectory("assets", "bin/assets"));
}
}
В IndexA.cshtml
:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="/assets/foo.js"></script>
</head>
<body></body>
</html>
Как упоминалось @eth0 в комментариях, вы также можете использовать сохранения представлений в качестве ресурсов, но это выходит за рамки моего ответа. Вот хорошая статья на эту тему:http://colinmackay.scot/2013/05/02/configuring-the-nancy-to-use-views-in-a-separate-assembly /