如何通过 Razor Pages 扩展 ASP.NET Core MVC 项目?

Tim*_*yer 5 c# asp.net razor asp.net-core-mvc asp.net-core

我目前正在尝试通过 Razor 页面扩展现有的 ASP.NET Core MVC 项目(因为几个教程视频声称 MVC、API、Razor 和 Blazor 可以在同一个项目中共存 - 但没有一个显示它是如何完成的)。

我已经发现我需要通过以下方式扩展 Startup.cs

services.AddRazorPages();
Run Code Online (Sandbox Code Playgroud)

app.UseEndpoints(endpoints =>
{
    // This was here already
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    // I added this
    endpoints.MapRazorPages();
});
Run Code Online (Sandbox Code Playgroud)

我尝试简单地在Views文件夹中添加一个剃刀页面“测试” ,_Layout.cshtml通过

<li class="nav-item">
    <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Test">Test</a>
</li>
Run Code Online (Sandbox Code Playgroud)

然后HomeController通过

    public IActionResult Test()
    {
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

但是,这会导致几个问题,即未命中断点或ViewData字典null(在纯 Razor 页面项目中使用相同的代码),可能是因为它尝试将 Razor 页面视为 MVC 视图或其他东西。

我也试过添加类似的东西

<li class="nav-item">
    <a class="nav-link text-dark" asp-area="" asp-page="/Home/Test">Test</a>
</li>
Run Code Online (Sandbox Code Playgroud)

改为布局,但这会产生一个像

https://localhost:5001/?page=%2FHome%2FTest
Run Code Online (Sandbox Code Playgroud)

单击导航栏项目时。

我可以在单独的 VS 项目中完美地拥有这两个东西,但是没有办法在单个 VS 项目和单个布局中同时使用它们吗?

如果您想在回答之前尝试一下,请使用以下步骤:

  1. 在 Visual Studio 2019 中创建新项目/解决方案
  2. 选择“ASP.NET Core Web Application”作为项目模板
  3. 单击“创建”并选择“Web 应用程序(模型-视图-控制器)”作为具有默认设置的模板
  4. 在 Startup.cs 中添加 Razor 支持
  5. 尝试在这个项目中制作一个简单的剃​​刀页面

dbv*_*ega 6

剃刀页面不需要控制器。

默认目录是/Pages,那么默认情况下所有页面都应该在Pages目录中。如果你想改变它,你可以通过ConfigureServices在启动时覆盖配置来实现。

services.AddRazorPages(c=>c.RootDirectory = "/PagesRootDir");
Run Code Online (Sandbox Code Playgroud)

要创建指向页面的链接,您应该使用asp-page标签。例如,如果页面名称是Test物理路径(默认情况下)将为Pages\Test. 要生成链接,您需要使用:

<a asp-page="/Test">Test Page</a>
Run Code Online (Sandbox Code Playgroud)

默认情况下,页面不会使用默认布局,您可以随时覆盖它。

@page
@model WebApplication1.Pages.TestModel
@{
    Layout = "_Layout";
}

<h1>
    Test Page
</h1>
Run Code Online (Sandbox Code Playgroud)

要删除布局:

Layout = null;
Run Code Online (Sandbox Code Playgroud)

如果要在所有页面上使用“Views\Shared\_Layout”,则需要_ViewStart使用以下代码创建一个:

@{
    Layout = "_Layout";
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明