在Blazor组件中初始化对象

Orw*_*wel 3 .net c# blazor

使用此Blazor组件:

@page "/counter"

<h1>Counter</h1>

<p>Current count: @_a.CurrentCount</p>

<button class="btn btn-primary" onclick="@_b.IncrementCount">Click me</button>

@functions {
    private readonly ClassA _a = new ClassA();
    private readonly ClassB _b = new ClassB(_a);

    class ClassA
    {
        public int CurrentCount { get; set; }
    }

    class ClassB
    {
        private readonly ClassA _classA;

        public ClassB(ClassA classA)
        {
            _classA = classA;
        }

        public void IncrementCount() => _classA.CurrentCount++;
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

错误CS0236字段初始值设定项无法引用非静态字段,方法或属性'__Counter._a'

此线程说明如何解决标准类中的此错误:

为什么不能在成员初始化程序中使用“ this”?

但是为此,它需要一个构造函数。

是否可以在Blazor组件中添加构造函数?

如何解决此错误?

dan*_*era 5

为了使类保持只读状态,您应该移至“ code-behind”。然后可以实例化构造函数上的类:

@page "/counter"
@inherits CounterBase
<h1>Counter</h1>

<p>Current count: @_a.CurrentCount ...
Run Code Online (Sandbox Code Playgroud)

CounterBase.cs

using Microsoft.AspNetCore.Blazor.Components;

namespace YourApp.Pages
{

    public class ClassA
    {
        public int CurrentCount { get; set; }
    }

    public class ClassB
    {
        private readonly ClassA _classA;

        public ClassB(ClassA classA)
        {
            _classA = classA;
        }

        public void IncrementCount() => _classA.CurrentCount++;
    }

    public class CounterBase : BlazorComponent
    {
        protected readonly ClassA _a;
        protected readonly ClassB _b;

        //constructor
        public CounterBase()
        {
            _a = new ClassA();
            _b = new ClassB(_a);
        }
        ...
Run Code Online (Sandbox Code Playgroud)