Я изучаю Razor. У меня есть очень простой компонент Razor (использующий платформу MudBlazor) в Budget.razor

@page "/budget"

<PageTitle>Budget</PageTitle>

<MudGrid>
    <MudItem xs="12" sm="6" md="4">
        <p> Hello you @HelloConsole() </p>
        </MudItem>
</MudGrid>

И частичный класс в Budget.razor.cs:

namespace MyProject.Pages
{
   public partial class Budget
    {
        protected void HelloConsole()
        {
            Console.WriteLine("Hello");
        }
    }
}

Я получаю сообщение об ошибке в Visual Studio:

Cannot implicitly convert type 'void' to 'object'

Что я делаю не так ?

1
FenryrMKIII 27 Ноя 2021 в 16:44
Я не знаю про блейзер, но думаю, что вам следует изменить метод на метод protected string HelloConsole(){return “Hello;”}
 – 
vivek nuna
27 Ноя 2021 в 16:49
Я очень хочу понять, почему это не работает без изменения фактической реализации
 – 
FenryrMKIII
27 Ноя 2021 в 16:58
Потому что в существующей реализации он ожидает, что метод что-то вернет, и по умолчанию это объект. И это значение будет отображаться во время выполнения. Ваш текущий метод возвращает void, а не какой-либо объект
 – 
vivek nuna
27 Ноя 2021 в 17:00
Где в моей реализации я могу увидеть, что он ожидает объект? Или это где-то в реализации Blazor?
 – 
FenryrMKIII
27 Ноя 2021 в 17:05
Строка, в которой есть @HelloConsole, вызывает метод HelloConsole
 – 
vivek nuna
27 Ноя 2021 в 17:09

2 ответа

Лучший ответ
<p> Hello you @HelloConsole() </p>

Говорит, поместите сюда вывод метода HelloConsole(). Но HelloConsole возвращает пустоту - именно то, что написано в ошибке, - которую средство визуализации не может обработать.

Это работает:

protected string HelloConsole()
{
   Console.WriteLine("Hello");
   return "I just wrote to the console";
}
1
MrC aka Shaun Curtis 27 Ноя 2021 в 17:09
Значит, директива @ не означает "выполнить это"?
 – 
FenryrMKIII
27 Ноя 2021 в 17:09
В процессе рендеринга будет отображаться то, на что он указывает. Если это свойство, он вызовет метод получения, если это поле, он выведет поле, если это метод, он вызовет метод и отобразит возвращаемое значение. Он ожидает объект и отображает его в виде строки.
 – 
MrC aka Shaun Curtis
27 Ноя 2021 в 17:14
Итак, в Blazor нет возможности просто сказать «выполнить это», не ожидая чего-либо еще? Я понимаю, что это довольно теоретически, но, учитывая, что я наткнулся на это, я хочу воспользоваться возможностью, чтобы действительно понять это
 – 
FenryrMKIII
27 Ноя 2021 в 17:15
Конечно, если вы хотите, чтобы он просто запускал код, вы можете поместить эту логику в любое из событий жизненного цикла, например OnInitialized. Если вы хотите, чтобы с шаблоном что-то работало, он должен предоставить что-то, что может интерпретировать средство визуализации. Здесь вам может быть полезна документация по событиям жизненного цикла: docs.microsoft.com/en-us/aspnet/core/blazor/components/…
 – 
GenericUser
27 Ноя 2021 в 17:19

Вы пишете в консоль. Разметка Blazor ожидает объект (потому что он в основном отображает набор строк). Измените код, чтобы вернуть «Привет». Это будет работать.

0
Mayur Ekbote 27 Ноя 2021 в 17:12