#asp.net-core #f# #asp.net-core-mvc #static-files
#asp.net-ядро #f# #asp.net-core-mvc #статические файлы
Вопрос:
Я пытался создать очень простой проект MVC на F #. Вот краткое объяснение того, что я сделал, и я был бы признателен за любую помощь в этом.
- Я создал новое «ASP .NET Core Web Application», используя шаблон VS 2019 для F #.
- Затем я выбрал «ASP.NET Ядро пустое», ASP.NET Ядро 5.0.
- Я добавил в проект несколько файлов, чтобы структура выглядела следующим образом:
/ Root
| appsettings.json
| Views
| Home
| Index.cshtml // added as "Content", "Do not copy"
HomeController.fs
Startup.fs
Program.fs
Контроллер очень прост:
type HomeController() =
inherit Controller()
this.Index() =
this.View()
Затем, когда я запускаю свое приложение, я получаю сообщение об ошибке:
InvalidOperationException: The view 'Index' was not found. The following locations were searched:
/Views/Home/Index.cshtml
/Views/Shared/Index.cshtml
Поэтому, хотя мой файл cshtml есть, он не может быть найден средой выполнения.
Я убедился, что «UseStaticFiles» включен в классе запуска:
type Startup() =
member __.ConfigureServices(services) : unit =
services.AddControllersWithViews() |> ignore
member __.Configure(app, env) : unit =
// env.ContentRootFileProvider.Root is set to my Root folder
app.UseStaticFiles() |> ignore
app.UseRouting() |> ignore
app.UseAuthorization() |> ignore
app.UseEndpoints(fun endpoints ->
endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}") |> ignore
) |> ignore
Идем дальше
Я попытался обойти проблему и прочитать содержимое cshtml вручную и вернуть его в виде строки
type HomeController() =
inherit Controller()
member this.ManualIndex() =
let html = System.IO.File.ReadAllText("/Views/Index.cshtml")
this.Content(html, "text/html")
и это сработало, но из HTML я все еще не могу ссылаться на какие-либо другие статические файлы, такие как css или js. Я также попытался создать каталог wwwroot и поместить туда свой статический контент, но и это не помогло.
Комментарии:
1. Если чтение
/Views/Index.cshtml
сработало, это означаетViews
, что каталог находится в корне вашей файловой системы, а не в корне вашего проекта.2. Хорошо, я перепроверю это. Спасибо за подсказку.
Ответ №1:
Оказалось, что версия проекта MVC на F # немного отличается от его аналога на C #, хотя я предполагал, что это всего лишь вопрос синтаксиса.
Для того, чтобы Razor работал в проекте F #, требуется дополнительный пакет NuGet: Microsoft.AspNetCore.Mvc.Razor.Компиляция во время выполнения. Тогда в классе запуска требуется расширение (AddRazorRuntimeCompilation):
member this.ConfigureServices(services: IServiceCollection) =
services.AddControllersWithViews().AddRazorRuntimeCompilation() |> ignore
services.AddRazorPages() |> ignore
Я не особо разбирался в этом, но я предполагаю, что это связано с взаимодействием C #-F #. Расширение файла razor (cshtml) предполагает, что он основан на C #. При попытке использовать его из проекта F # могут возникнуть некоторые трудности.
Двигаясь вперед, я рекомендую создать проект F # MVC с использованием шаблонов dotnet. Тот, который мне нужен, может быть создан с помощью следующей команды:
dotnet new mvc --language=F#