【问题标题】:Copy Views folder for Asp.Net in .Net5在 .Net5 中复制 Asp.Net 的 Views 文件夹
【发布时间】:2021-07-19 12:31:32
【问题描述】:

在 Asp.Net 中,许多事情会随着版本的变化而变化,具体取决于 .Net 版本。我有一个 .Net5 项目,但无法在构建文件夹中添加 Views 文件夹。 我尝试在我的 csproj 文件中添加下一行:

<PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <PreserveCompilationContext>true</PreserveCompilationContext>
    <RazorCompileOnBuild>false</RazorCompileOnBuild>
</PropertyGroup>

结果是我在调试、发布或发布文件夹中仍然没有 Views 文件夹。如果我尝试在调试模式下运行,我会收到缺少视图的错误:

InvalidOperationException: The view 'Index' was not found. The following locations were searched:
    /Views/Home/Index.cshtml
    /Views/Shared/Index.cshtml

这是我的 ConfigureServices 方法:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
    services.AddAuthentication(IdentityConstants.ApplicationScheme)
        .AddCookie(IdentityConstants.ApplicationScheme, o =>
        {
            o.Cookie.Path = "/";
        });

    services.AddControllersWithViews(o => o.Filters.Add(new AuthorizeFilter()));
}

CopyRazorGenerateFilesToPublishDirectory 添加到 csproj 不会改变任何事情。

<CopyRazorGenerateFilesToPublishDirectory>true</CopyRazorGenerateFilesToPublishDirectory>

stackoverflow 上有一些解决方案,但都是关于旧版本的,如 .net 框架和 .net core 2 或 3。它们都不适合我。

  • 只是为了澄清。我可以让它编译所有项目,但我需要编辑我的剃须刀页面,而无需重新编译我的应用程序。这就是我希望我的视图被复制的原因。

编辑:添加对 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 包的引用并在服务配置中设置 Razor RuntimeCompilation ...

services.AddControllersWithViews()
    .AddRazorRuntimeCompilation();

...您可以在从 VS 运行应用程序时编辑视图,而无需重新编译(未选中)。然后,如果我在我的 csproj 中添加CopyRazorGenerateFilesToPublishDirectory,我的发布文件夹中有可编辑的视图。问题是当我修改任何视图时都会出现异常:System.InvalidOperationException: Cannot find reference assembly 'Microsoft.AspNetCore.Antiforgery.dll' file for package Microsoft.AspNetCore.Antiforgery.Reference。不知道怎么解决。

【问题讨论】:

  • 您是否尝试过创建新的 Core 5 应用程序?您将在 bin\Debug\net5.0 下拥有一个 WebApplication.Views.dll(假设您的应用名为 WebApplication)
  • 也许我没有解释清楚,但我希望在我的发布文件夹中有剃须刀页面,而不是包含视图代码的 dll。
  • 你为什么要那个?用例是什么?
  • 此时,只是因为前端设计将由不太了解csharp的设计师编写,不需要知道如何编译或发布。但是有很多情况需要这个选项。我喜欢在运行时编辑一些代码的可能性,就像你可以在 php 脚本中那样。
  • 我们是在讨论修改生产代码运行时,还是在开发期间?对于后者,我们有"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"

标签: c# asp.net-core asp.net-core-mvc .net-5


【解决方案1】:

也许尝试检查新创建的空项目

dotnet new webapp --razor-runtime-compilation

它将创建以下项目

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <CopyRefAssembliesToPublishDirectory>false</CopyRefAssembliesToPublishDirectory>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="5.0.0" />
  </ItemGroup>

</Project>

现在检查 Startup.cs 文件中的ConfigureServices 方法:

  
public void ConfigureServices(IServiceCollection services)

     services.AddRazorPages();
  // services.AddMvc();  
  // services.AddRazorPages().AddRazorRuntimeCompilation();
}

这里我们看到 services.AddRazorPages() 扩展方法被调用,所以我们可以在调用 services.AddControllersWithViews() 时期待 Razor Views 功能

总而言之,添加 nuget 包引用 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 并调用 services.AddControllersWithViewsservices.AddMvc 应该会在项目中添加对 Razor 视图的支持。

另外配置你的视图位置就像调用:

 services.AddControllersWithViews()
         .AddRazorOptions(options =>
         {
                options.ViewLocationFormats.Add("/{0}.cshtml");
         });

查看来源:https://source.dot.net/#Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs,27:

 public static IMvcBuilder AddMvc(this IServiceCollection services)
 {
     if (services == null)
     {
       throw new ArgumentNullException(nameof(services));
     }
 
            services.AddControllersWithViews();
            return services.AddRazorPages();
 } 

【讨论】:

  • 我编辑了我的问题。现在我可以在我的构建文件夹中获取我的视图,但是如果我修改任何视图,我会得到一个异常:System.InvalidOperationException: Cannot find reference assembly 'Microsoft.AspNetCore.Antiforgery.dll' file for package Microsoft.AspNetCore.Antiforgery.Reference
  • 先生有进展吗? @安东尼奥
  • 不,先生。我可以在我的发布文件夹中获取我的视图,但我无法修改它们,除非有异常。
  • @AntonioRodríguez 检查我的附加答案
【解决方案2】:

问题是,当我修改任何视图时出现异常:System.InvalidOperationException:找不到包 Microsoft.AspNetCore.Antiforgery.Reference 的参考程序集“Microsoft.AspNetCore.Antiforgery.dll”文件。不知道怎么解决。

拥有 &lt;CopyRefAssembliesToPublishDirectory&gt;false&lt;/CopyRefAssembliesToPublishDirectory&gt; 从发布的 (dotnet publish) 文件夹运行应用程序并尝试更改视图后,重现了缺少程序集 'Microsoft.AspNetCore.Antiforgery.dll' 参考的问题。

还原&lt;CopyRefAssembliesToPublishDirectory&gt;true&lt;/CopyRefAssembliesToPublishDirectory&gt; 后,问题消失了。

这是我的 .csproj,应该可以与 dotnet publish 一起正常工作

 
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <RazorCompileOnBuild>false</RazorCompileOnBuild>
    <CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory>
    <CopyRazorGenerateFilesToPublishDirectory>true</CopyRazorGenerateFilesToPublishDirectory>       
    <PreserveCompilationReferences>true</PreserveCompilationReferences>
    <PreserveCompilationContext>true</PreserveCompilationContext>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="5.0.5" />
  </ItemGroup>

  <ItemGroup>
   <KnownFrameworkReference Update="Microsoft.AspNetCore.App">
     <TargetingPackVersion>5.0.0</TargetingPackVersion>
   </KnownFrameworkReference>
 </ItemGroup>

</Project>

【讨论】:

    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2012-03-26
    • 2013-07-30
    • 1970-01-01
    相关资源
    最近更新 更多