Blazor 中的单独代码文件提供虚假警告消息
Separate code file in Blazor gives bogus warning messages
我有一个服务器端 Blazor 应用程序。在 Blazor 下编写 razor 页面时有两种选择:在一个“.razor”文件中设计代码和 C# 代码,并将设计和代码文件分开为“.razor”和“.razor.cs”文件。问题是 Visual Studio 不完全支持 razor 页面中的智能感知,但您始终可以将代码放入单独的文件并使用完整的智能感知支持。这是一个包含代码块的最小样本剃须刀页面:
@page "/minimalsample"
<h3>MinimalSample</h3>
<MatChip Raised="true" @onclick="@OpenUp" @ref="SampleMenuButton" Label="Actions" LeadingIcon="cloud_download"></MatChip>
<MatMenu @ref="SampleMenu">
<MatList SingleSelection="false" TwoLine="false">
<MatListItem OnClick="@Format_Clicked" Style="height: auto">
Format C: Drive
</MatListItem>
<MatListItem OnClick="@Shred_Clicked" Style="height: auto">
Shred files
</MatListItem>
</MatList>
</MatMenu>
<br />
@ActionText
@code {
private BaseMatMenu SampleMenu;
private BaseMatChip SampleMenuButton;
private string ActionText;
private void OpenUp()
{
SampleMenu.OpenAsync(SampleMenuButton.Ref);
}
private void Format_Clicked()
{
ActionText = "Formatting C: Drive...";
}
private void Shred_Clicked()
{
ActionText = "Shredding user files...";
}
}
此代码运行正常。当我单击按钮时它会打开一个菜单,菜单项也可以正常工作。我决定将代码和设计文件分开,以便能够使用 Visual Studio (2019) 的智能感知功能,现在我收到警告说:
Warning CS0649 Field 'MinimalSample.SampleMenu' is never assigned to,
and will always have its default value null
“.razor”页面如下:
@page "/minimalsample"
@namespace Pages
<h3>MinimalSample</h3>
<MatChip Raised="true" @onclick="@OpenUp" @ref="SampleMenuButton" Label="Actions" LeadingIcon="cloud_download"></MatChip>
<MatMenu @ref="SampleMenu">
<MatList SingleSelection="false" TwoLine="false">
<MatListItem OnClick="@Format_Clicked" Style="height: auto">
Format C: Drive
</MatListItem>
<MatListItem OnClick="@Shred_Clicked" Style="height: auto">
Shred files
</MatListItem>
</MatList>
</MatMenu>
<br />
@ActionText
而代码文件“.razor.cs”为:
using MatBlazor;
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Pages
{
public partial class MinimalSample : ComponentBase
{
private BaseMatMenu SampleMenu;
private BaseMatChip SampleMenuButton;
private string ActionText;
private void OpenUp()
{
SampleMenu.OpenAsync(SampleMenuButton.Ref);
}
private void Format_Clicked()
{
ActionText = "Formatting C: Drive...";
}
private void Shred_Clicked()
{
ActionText = "Shredding user files...";
}
}
}
我不得不更改按钮和菜单引用以具有一些默认值(只是为了让编译器满意!)。
private BaseMatMenu SampleMenu = new BaseMatMenu();
private BaseMatChip SampleMenuButton = new BaseMatChip();
private string ActionText = "";
我知道这不是必需的,它在没有 new 运算符的情况下也能正常工作。然而编译器仍然抱怨变量 "ActionText" 已分配但其值从未使用过。
我想以适当的方式摆脱警告(将代码移动到 .razor 页面不是这里的选项)。我该怎么做才能摆脱这些警告?这有可能是编译器错误吗?
更新:
@NikProtsman 提供了一个可行的解决方案。我刚刚删除了 partial 修饰符,并将“.razor.cs”中的 class 定义的名称从
更改为
public partial class MinimalSample : ComponentBase
至
public class MinimalSampleBase : ComponentBase
我也将 private 修饰符更改为 protected
...
...
public class MinimalSampleBase : ComponentBase
{
protected BaseMatMenu SampleMenu;
protected BaseMatChip SampleMenuButton;
protected string ActionText;
protected void OpenUp()
{
SampleMenu.OpenAsync(SampleMenuButton.Ref);
}
protected void Format_Clicked()
{
ActionText = "Formatting C: Drive...";
}
protected void Shred_Clicked()
{
ActionText = "Shredding user files...";
}
}
...
...
后来我像这样更改了“.razor”页面
@page "/minimalsample"
@namespace Pages
// added this line
@inherits MinimalSampleBase
...
...
现在我没有收到警告,而且我的代码是 运行,符合预期。
看起来我们需要等待 .NET 5:“这看起来是我们如何在预构建步骤中生成 Blazor 文件的骨架的问题,因为该预构建步骤删除了所有 Razor 内容比 @functions / @code 中的内容要多。从技术上讲,这将由源代码生成器修复,但那些在 .NET 5 的切割线上。"
https://github.com/dotnet/aspnetcore/issues/20137
编辑:我确认问题已在 .NET 5 中解决。它在没有 inheritance/protected 属性等的情况下工作。
文档显示使用部分 Class 方法,但我总是更幸运地使用继承模型。对于您的 .razor.cs 文件,您可以尝试将 class 称为基数:public class MinimalSampleBase : ComponentBase
,然后在您的 .razor 文件中添加 @inherits MinimalSampleBase
。您 需要 在标记页面上使用的所有 private
字段和方法现在应改为 protected
,但支持字段和支持方法仍应标记为私有.基础 class 现在变成了 "View Model" 并且仍然获得完整的 VS Intellisense 和重构支持,并且您可以获得代码隐藏方法的所有好处,并且希望在您的情况下它会使那些编译器警告消失.
我还发现部分 Class 方法会在我需要实现接口的任何地方引起问题,例如设置服务的事件订阅和使用 IDisposable 在拆卸时取消订阅。然而,继承模型工作得很好。
请试一试并反馈,我认为这会有所帮助,但我很好奇想确定一下。
我有一个服务器端 Blazor 应用程序。在 Blazor 下编写 razor 页面时有两种选择:在一个“.razor”文件中设计代码和 C# 代码,并将设计和代码文件分开为“.razor”和“.razor.cs”文件。问题是 Visual Studio 不完全支持 razor 页面中的智能感知,但您始终可以将代码放入单独的文件并使用完整的智能感知支持。这是一个包含代码块的最小样本剃须刀页面:
@page "/minimalsample"
<h3>MinimalSample</h3>
<MatChip Raised="true" @onclick="@OpenUp" @ref="SampleMenuButton" Label="Actions" LeadingIcon="cloud_download"></MatChip>
<MatMenu @ref="SampleMenu">
<MatList SingleSelection="false" TwoLine="false">
<MatListItem OnClick="@Format_Clicked" Style="height: auto">
Format C: Drive
</MatListItem>
<MatListItem OnClick="@Shred_Clicked" Style="height: auto">
Shred files
</MatListItem>
</MatList>
</MatMenu>
<br />
@ActionText
@code {
private BaseMatMenu SampleMenu;
private BaseMatChip SampleMenuButton;
private string ActionText;
private void OpenUp()
{
SampleMenu.OpenAsync(SampleMenuButton.Ref);
}
private void Format_Clicked()
{
ActionText = "Formatting C: Drive...";
}
private void Shred_Clicked()
{
ActionText = "Shredding user files...";
}
}
此代码运行正常。当我单击按钮时它会打开一个菜单,菜单项也可以正常工作。我决定将代码和设计文件分开,以便能够使用 Visual Studio (2019) 的智能感知功能,现在我收到警告说:
Warning CS0649 Field 'MinimalSample.SampleMenu' is never assigned to, and will always have its default value null
“.razor”页面如下:
@page "/minimalsample"
@namespace Pages
<h3>MinimalSample</h3>
<MatChip Raised="true" @onclick="@OpenUp" @ref="SampleMenuButton" Label="Actions" LeadingIcon="cloud_download"></MatChip>
<MatMenu @ref="SampleMenu">
<MatList SingleSelection="false" TwoLine="false">
<MatListItem OnClick="@Format_Clicked" Style="height: auto">
Format C: Drive
</MatListItem>
<MatListItem OnClick="@Shred_Clicked" Style="height: auto">
Shred files
</MatListItem>
</MatList>
</MatMenu>
<br />
@ActionText
而代码文件“.razor.cs”为:
using MatBlazor;
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Pages
{
public partial class MinimalSample : ComponentBase
{
private BaseMatMenu SampleMenu;
private BaseMatChip SampleMenuButton;
private string ActionText;
private void OpenUp()
{
SampleMenu.OpenAsync(SampleMenuButton.Ref);
}
private void Format_Clicked()
{
ActionText = "Formatting C: Drive...";
}
private void Shred_Clicked()
{
ActionText = "Shredding user files...";
}
}
}
我不得不更改按钮和菜单引用以具有一些默认值(只是为了让编译器满意!)。
private BaseMatMenu SampleMenu = new BaseMatMenu();
private BaseMatChip SampleMenuButton = new BaseMatChip();
private string ActionText = "";
我知道这不是必需的,它在没有 new 运算符的情况下也能正常工作。然而编译器仍然抱怨变量 "ActionText" 已分配但其值从未使用过。
我想以适当的方式摆脱警告(将代码移动到 .razor 页面不是这里的选项)。我该怎么做才能摆脱这些警告?这有可能是编译器错误吗?
更新:
@NikProtsman 提供了一个可行的解决方案。我刚刚删除了 partial 修饰符,并将“.razor.cs”中的 class 定义的名称从
更改为public partial class MinimalSample : ComponentBase
至
public class MinimalSampleBase : ComponentBase
我也将 private 修饰符更改为 protected
...
...
public class MinimalSampleBase : ComponentBase
{
protected BaseMatMenu SampleMenu;
protected BaseMatChip SampleMenuButton;
protected string ActionText;
protected void OpenUp()
{
SampleMenu.OpenAsync(SampleMenuButton.Ref);
}
protected void Format_Clicked()
{
ActionText = "Formatting C: Drive...";
}
protected void Shred_Clicked()
{
ActionText = "Shredding user files...";
}
}
...
...
后来我像这样更改了“.razor”页面
@page "/minimalsample"
@namespace Pages
// added this line
@inherits MinimalSampleBase
...
...
现在我没有收到警告,而且我的代码是 运行,符合预期。
看起来我们需要等待 .NET 5:“这看起来是我们如何在预构建步骤中生成 Blazor 文件的骨架的问题,因为该预构建步骤删除了所有 Razor 内容比 @functions / @code 中的内容要多。从技术上讲,这将由源代码生成器修复,但那些在 .NET 5 的切割线上。"
https://github.com/dotnet/aspnetcore/issues/20137
编辑:我确认问题已在 .NET 5 中解决。它在没有 inheritance/protected 属性等的情况下工作。
文档显示使用部分 Class 方法,但我总是更幸运地使用继承模型。对于您的 .razor.cs 文件,您可以尝试将 class 称为基数:public class MinimalSampleBase : ComponentBase
,然后在您的 .razor 文件中添加 @inherits MinimalSampleBase
。您 需要 在标记页面上使用的所有 private
字段和方法现在应改为 protected
,但支持字段和支持方法仍应标记为私有.基础 class 现在变成了 "View Model" 并且仍然获得完整的 VS Intellisense 和重构支持,并且您可以获得代码隐藏方法的所有好处,并且希望在您的情况下它会使那些编译器警告消失.
我还发现部分 Class 方法会在我需要实现接口的任何地方引起问题,例如设置服务的事件订阅和使用 IDisposable 在拆卸时取消订阅。然而,继承模型工作得很好。
请试一试并反馈,我认为这会有所帮助,但我很好奇想确定一下。