@kolejium
Программист .NET, увлекаюсь дизайном и 3D графикой

WebApi + Razor как это должно работать?

Привет!
Уже довольно давно пишу различные сервисы и микро сервисы в связке Архитектура -> WebApi -> React/Angular(морда короче).
Дали таску надо использовать WebApi + Razor. Razor'ом пользовался очень давно еще когда только MVC изучал. Каким образом я могу это совместить?
ВАЖНО! WebApi + Razor должно быть в одной сборке. Ну и по идее Razor хоть как-то дельно использован должен быть.
Детали:
У меня есть Apiшные контроллеры - работают замечательно. К Asp.Net Core подключен Ninject (Заменен стандартный DI).
Апишный контроллер получает сервис из бизнес логики. Использовать сервис и в RazorPage нарушает принцип Dry.

Не ужели надо выюзывать HttpClient???
Просто если я буду юзать исключительно JS/jQuery не варик.
  • Вопрос задан
  • 184 просмотра
Пригласить эксперта
Ответы на вопрос 1
@kttotto
пофиг на чем писать
Mvc на основе cshtml файлов генерит html и отдает его клиенту. Тоже самое можете делать Вы сами руками в WebApi приложении, используя RazorEngine.Templating.
Вот ссылка на похожий вопрос.
И прилагаю урезанный пример, который мы использовали у себя для генерации отчетов, я думаю разберетесь.
spoiler
public class RazorTemplateGenerator
{
	public void SetupReportTemplating(string baseDirectory = null)
	{
		var cfg = new TemplateServiceConfiguration
		{
			Debug = true
		};

		Engine.Razor = RazorEngineService.Create(cfg);

		var folder = Path.Combine(baseDirectory ?? System.AppDomain.CurrentDomain.BaseDirectory, "Pages","PageTemplates");
		var templates = Directory.GetFiles(folder, "*.cshtml");
		foreach (var fName in templates)
		{
			var info = new FileInfo(fName);
			var tName = Path.GetFileNameWithoutExtension(info.Name);
			var template = File.ReadAllText(fName);
			var src = new LoadedTemplateSource(template, fName.Replace(@"\bin",String.Empty));
			Engine.Razor.AddTemplate(tName, src);
		}
	}

	public void CheckCompile(string name)
	{
		Engine.Razor.Compile(name);
	}

	public string RenderPage(string viewName, object model)
	{
		return Engine.Razor.RunCompile(viewName, model.GetType(), model);
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы