Asp.Net Основная проблема с представлениями и статическими файлами (F #)

#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#