Отдельный кодовый файл в Blazor выдает поддельные предупреждающие сообщения - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть серверное приложение Blazor. Существует два варианта написания страницы бритвы в Blazor: код дизайна и код C# в одном файле ".razor" и отдельные файлы дизайна и кода в виде файлов ".razor" и ".razor.cs". Проблема в том, что Visual Studio не полностью поддерживает intellisense на бритвенных страницах, но вы всегда можете поместить свой код в отдельный файл и использовать полную поддержку intellisense. Вот минимальный пример страницы бритвы с блоком кода в нем:

@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...";
    }

}

Этот код работает правильно. Когда я нажимаю кнопку, открывается меню, и пункты меню также работают нормально. Я решил разделить файлы кода и дизайна, чтобы использовать возможности IntelliSense в 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 предоставил работающее решение. Я просто удалил частичный модификатор и изменил имя определения класса в ".razor.cs" с

public partial class MinimalSample : ComponentBase

на

public class MinimalSampleBase : ComponentBase

Я также изменил приватные модификаторы для защищенных

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

Теперь я я не получаю предупреждений, и мой код работает, как ожидалось.

1 Ответ

1 голос
/ 27 апреля 2020

Документация показывает использование подхода Partial Class, но мне всегда повезло с использованием модели наследования. Для вашего файла .razor.cs вы можете попробовать назвать класс base: public class MinimalSampleBase : ComponentBase, а затем в вашем файле .razor добавить @inherits MinimalSampleBase. Все ваши private поля и методы, которые вам нужно использовать, чтобы использовать их на странице разметки, теперь должны быть protected, но вспомогательные поля и методы поддержки должны быть помечены как частные. Базовый класс теперь становится «моделью представления» и по-прежнему получает полную поддержку VS Intellisense и поддержку рефакторинга, и вы получаете все преимущества подхода Code Behind, и, надеюсь, в вашем случае он уберет эти предупреждения компилятора go.

Я также обнаружил, что подход с частичным классом создает проблемы для всего, где мне нужно реализовать интерфейсы, например, при настройке подписок на события для службы и использовании IDisposable для отмены подписки на разбор. Однако модель наследования работает отлично.

Сделайте попытку и сообщите, пожалуйста, я думаю, это поможет, но мне очень любопытно узнать наверняка.

...