C# 如何通过Razor页面扩展ASP.NET核心MVC项目?

C# 如何通过Razor页面扩展ASP.NET核心MVC项目?,c#,asp.net,asp.net-core,razor,asp.net-core-mvc,C#,Asp.net,Asp.net Core,Razor,Asp.net Core Mvc,我目前正试图通过Razor页面扩展现有的ASP.NET核心MVC项目(因为一些教程视频声称MVC、API、Razor和Blazor可以共存于同一个项目中,但没有一个视频显示它是如何实现的) 我已经发现我需要将Startup.cs扩展到 services.AddRazorPages(); 及 我试着简单地在视图文件夹中添加一个razor页面“Test”,扩展\u Layout.cshtml <li class="nav-item"> <a class

我目前正试图通过Razor页面扩展现有的ASP.NET核心MVC项目(因为一些教程视频声称MVC、API、Razor和Blazor可以共存于同一个项目中,但没有一个视频显示它是如何实现的)

我已经发现我需要将Startup.cs扩展到

services.AddRazorPages();

我试着简单地在
视图
文件夹中添加一个razor页面“Test”,扩展
\u Layout.cshtml

<li class="nav-item">
    <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Test">Test</a>
</li>
    public IActionResult Test()
    {
        return View();
    }
但是,这会导致断点未命中,或者
ViewData
字典为
null
(在纯Razor页面项目中使用相同的代码),这可能是因为它试图将Razor页面视为MVC视图或其他内容

我还尝试添加了一些类似的内容

<li class="nav-item">
    <a class="nav-link text-dark" asp-area="" asp-page="/Home/Test">Test</a>
</li>
单击导航栏项目时

我可以在单独的VS项目中完美地使用这两种功能,但是有没有一种方法可以在单个VS项目和单个布局中同时使用这两种功能

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

  • 在Visual Studio 2019中创建新项目/解决方案
  • 选择“ASP.NET核心Web应用程序”作为项目模板
  • 单击“创建”并选择“Web应用程序(模型视图控制器)”作为默认设置的模板
  • 在Startup.cs中添加Razor支持
  • 尝试在这个项目中创建一个简单的razor页面

  • 我找到了一个目前似乎有效的解决方案:在Startup.cs中,将razor pages配置为查看/Views文件夹,而不是默认的/pages(这显然打破了惯例):

    使用此选项,我可以在不调整控制器的情况下使用
    asp页面
    样式的导航项


    如果你能告诉我如何在不违反默认约定的情况下做到这一点,我仍然会接受任何人的回答(我的主要问题是我不知道如何使用
    页面
    文件夹、
    视图
    文件夹和
    \u Layout.cshtml
    仅在其中一个文件夹中。)

    剃须刀页面不需要控制器

    默认目录是
    /Pages
    ,那么默认情况下,所有页面都应该位于
    Pages
    目录中。如果要更改,可以在启动时覆盖
    ConfigureServices
    中的配置

    services.AddRazorPages(c=>c.RootDirectory = "/PagesRootDir");
    
    要创建指向页面的链接,应使用
    asp页面
    标记。例如,如果页面名称为
    Test
    ,则物理路径(默认情况下)将为
    Pages\Test
    。要生成链接,您需要使用:

    <a asp-page="/Test">Test Page</a>
    
    如果要在所有页面上使用“视图\共享\\u布局”,则需要使用以下代码创建一个
    \u ViewStart

    @{
        Layout = "_Layout";
    }
    

    页面不应该在pages文件夹中吗?谢谢,这正是我要找的。它允许缓慢地转换到Razor页面,而不需要注意前端的任何内容。
    services.AddRazorPages(c=>c.RootDirectory = "/PagesRootDir");
    
    <a asp-page="/Test">Test Page</a>
    
    @page
    @model WebApplication1.Pages.TestModel
    @{
        Layout = "_Layout";
    }
    
    <h1>
        Test Page
    </h1>
    
    Layout = null;
    
    @{
        Layout = "_Layout";
    }