У меня есть серверное приложение 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
Страница ".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
...
...
Теперь я я не получаю предупреждений, и мой код работает, как ожидалось.