ASP.NET Core 2 - ReSharper "Create Razor View" 将新视图添加到 Pages 文件夹

ASP.NET Core 2 - ReSharper "Create Razor View" adds new view to Pages folder

我已经开始尝试新的 ASP.NET Core 2 来构建 MVC Web 应用程序,到目前为止它看起来不错...

除了当我从我的控制器操作创建视图时,ReSharper 在 Pages 文件夹中创建它们,而不是 Views 文件夹(我通常喜欢保留 Views ;-) )

对于常规 ASP.NET Web 应用程序(非核心),ReSharper 不会这样做,它将视图放在正确的视图文件夹中,所以这看起来与核心/核心 2 有关。

resharper 使用什么来决定在哪里创建视图?

如何更改此行为 以便它在传统位置创建视图?

我认为这是 Resharper 中的一个错误,我怀疑它可能与刚刚发布的新 Razor Pages Apps .net core 2 团队有关。

所以,也许你最好在 Reshaper 的 Bug 跟踪系统上填写一个问题。

不过,我已经设法设置了一个解决方法。我在这里分享这些步骤,以防万一您需要尽快解决这个问题,当 JetBrains 解决这个问题时 - 如果它最终成为一个问题 :) - 您可以删除这个补丁。

  1. 安装 Jetbrains 注释的 nuget 包。

    Install-Package JetBrains.Annotations
    
  2. 在您的 asp.net 核心项目的根目录下创建一个 .cs 文件 - 我将其命名为 ResharperConfig.cs - 包含以下内容:

    using JetBrains.Annotations;
    
    [assembly: AspMvcMasterLocationFormat("~/Views/{1}/{0}.cshtml")]
    [assembly: AspMvcViewLocationFormat("~/Views/{1}/{0}.cshtml")]
    [assembly: AspMvcPartialViewLocationFormat("~/Views/Shared/{0}.cshtml")]
    [assembly: AspMvcAreaMasterLocationFormat("~/Areas/{2}/Views/{1}/{0}.cshtml")]
    [assembly: AspMvcAreaViewLocationFormat("~/Areas/{2}/Views/{1}/{0}.cshtml")]
    [assembly: AspMvcAreaPartialViewLocationFormat("~/Areas/{2}/Views/Shared/{0}.cshtml")]
    
  3. 构建您的项目并重新启动 VS。 (这对我很重要)。

  4. 当您重新打开解决方案时,R# 将识别视图的位置。现在您可以按照您习惯的方式从操作中创建视图。

希望对您有所帮助!

这仍然适用于随 VS 2022 安装的 ASP.NET Core Web App (Model-View-Controller) .NET 6 模板。R# 默认在 \Pages 中生成视图,无论如何这是错误的位置。

有了 ResharperConfig.cs(如上所述),现在 R# 会在正确的位置创建视图,假设视图的父文件夹存在。

我的以实体为中心的干净架构配置:

using JetBrains.Annotations;

[assembly: AspMvcMasterLocationFormat("~/Views/{1}/{0}.cshtml")]
[assembly: AspMvcViewLocationFormat("~/{1}/Views/{0}.cshtml")]
[assembly: AspMvcPartialViewLocationFormat("~/Views/Shared/{0}.cshtml")]
[assembly: AspMvcAreaMasterLocationFormat("~/Areas/{2}/Views/{1}/{0}.cshtml")]
[assembly: AspMvcAreaViewLocationFormat("~/Areas/{2}/Views/{1}/{0}.cshtml")]
[assembly: AspMvcAreaPartialViewLocationFormat("~/Areas/{2}/Views/Shared/{0}.cshtml")]

[assembly: AspMvcViewLocationFormat("~/{1}/Views/{0}.cshtml")] 确保 R# 在此位置生成视图: \<Controller>\Views\<Action>.cshtml

您应该将其与 IViewLocationExpander 结合使用,以指示 .NET 在渲染视图时也在同一位置查找视图:

using Microsoft.AspNetCore.Mvc.Razor;

public class CleanArchViewLocationExpander : IViewLocationExpander
{
    public void PopulateValues(ViewLocationExpanderContext context)
    {
    }

    public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
    {
        return viewLocations.Select(l => l.Replace("/Views/{1}/", "/{1}/Views/"));
    }
}

然后您可以像这样在 Program.cs 中注册:

builder.Services.Configure<RazorViewEngineOptions>(
    options =>
    {
        options.ViewLocationExpanders.Add(new CleanArchViewLocationExpander());
    });

编码愉快!