Blazor中的单独代码文件给出了虚假警告消息

问题描述 投票:0回答:2

我有一个服务器端Blazor应用程序。在Blazor下编写剃刀页面时,有两种选择:将设计代码和C#代码存储在一个“ .razor”文件中,并将设计和代码文件分隔为“ .razor”和“ .razor.cs”文件。问题是Visual Studio在剃须刀页面中不完全支持智能感知,但是您始终可以将代码放在单独的文件中,并使用完整的智能感知支持。这是其中包含代码块的最小剃刀示例页面:

@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)的智能感知功能,现在我收到警告说:

警告CS0649字段'MinimalSample.SampleMenu'从未分配给,并且将始终使用其默认值null

warning messages

“。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”中类定义的名称。public partial class MinimalSample : ComponentBase
to

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 ... ...

现在我没有收到警告,我的代码正在按预期运行。
c# visual-studio blazor matblazor
2个回答
1
投票
该文档显示使用Partial Class方法,但是我总是比较幸运的是使用继承模型。对于您的.razor.cs文件,您可以尝试将类称为基类:public class MinimalSampleBase : ComponentBase,然后在.razor文件中添加@inherits MinimalSampleBase。现在,您

需要在标记页面上使用的所有private字段和方法现在都应该为protected,但是后备字段和支持方法仍应标记为私有。现在,基类成为“视图模型”,并且仍然获得VS Intellisense和重构的完整支持,并且您将获得Code Behind方法的所有好处,并且希望您的情况能使那些编译器警告消失。

我还发现Partial Class方法会在需要实现接口的任何地方引起问题,例如在设置服务的事件订阅并使用IDisposable取消订阅时。但是,继承模型可以完美地工作。

请给我一个镜头,然后向我报告,我认为这会有所帮助,但我很想确定。


1
投票
看起来我们需要等待.NET 5:“这似乎与我们在预构建步骤中生成Blazor文件的框架有关,因为该预构建步骤将删除所有Razor内容,而不是其中的内容。 @functions / @code。从技术上讲,这将由源生成器解决,但对于.NET 5来说,这是最重要的。”

https://github.com/dotnet/aspnetcore/issues/20137

© www.soinside.com 2019 - 2024. All rights reserved.