Asp.Net 视图和静态文件的核心问题 (F#)
Asp.Net Core problem with Views and static files (F#)
我一直在尝试用 F# 创建一个非常简单的 MVC 项目。
这是我所做工作的简要说明,如果您对此有任何帮助,我将不胜感激。
- 我使用 F# 的 VS 2019 模板创建了一个新的“ASP .NET Core Web 应用程序”。
- 然后我选择了“ASP.NET Core Empty”,ASP.NET Core 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”class:
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 的内容,然后 return 将其作为字符串
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 目录并将我的静态内容放在那里,但也没有帮助。
事实证明,MVC 项目的 F# 版本与其对应的 C# 版本略有不同,而我原以为这只是语法问题。
为了让 Razor 在 F# 项目中工作,需要一个额外的 NuGet 包:Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation。然后在 Startup class 中需要一个扩展 (AddRazorRuntimeCompilation):
member this.ConfigureServices(services: IServiceCollection) =
services.AddControllersWithViews().AddRazorRuntimeCompilation() |> ignore
services.AddRazorPages() |> ignore
我没有深入研究它,但我想这与 C#-F# 互操作有关。剃刀的文件扩展名 (cshtml) 表明它依赖于 C#。尝试从 F# 项目中使用它时可能会有一些摩擦。
接下来,我建议使用 dotnet 模板创建 F# MVC 项目。可以使用以下命令创建我需要的那个:
dotnet new mvc --language=F#
我一直在尝试用 F# 创建一个非常简单的 MVC 项目。 这是我所做工作的简要说明,如果您对此有任何帮助,我将不胜感激。
- 我使用 F# 的 VS 2019 模板创建了一个新的“ASP .NET Core Web 应用程序”。
- 然后我选择了“ASP.NET Core Empty”,ASP.NET Core 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”class:
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 的内容,然后 return 将其作为字符串
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 目录并将我的静态内容放在那里,但也没有帮助。
事实证明,MVC 项目的 F# 版本与其对应的 C# 版本略有不同,而我原以为这只是语法问题。
为了让 Razor 在 F# 项目中工作,需要一个额外的 NuGet 包:Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation。然后在 Startup class 中需要一个扩展 (AddRazorRuntimeCompilation):
member this.ConfigureServices(services: IServiceCollection) =
services.AddControllersWithViews().AddRazorRuntimeCompilation() |> ignore
services.AddRazorPages() |> ignore
我没有深入研究它,但我想这与 C#-F# 互操作有关。剃刀的文件扩展名 (cshtml) 表明它依赖于 C#。尝试从 F# 项目中使用它时可能会有一些摩擦。
接下来,我建议使用 dotnet 模板创建 F# MVC 项目。可以使用以下命令创建我需要的那个:
dotnet new mvc --language=F#