【问题标题】:How do I convert a razor page with an injection to a code-behind?如何将带有注入的剃须刀页面转换为代码隐藏?
【发布时间】:2020-02-02 08:50:45
【问题描述】:

我正在修改 [Blazor 提示和技巧][1] 中的一个 blazor 示例

[1]:https://www.youtube.com/watch?v=3duXMxwnkXI 从第 17 分钟开始。

如果您在 Visual Studio 中创建一个名为 BlazorCounter 的新 Blazor 应用,并将生成的 Counter.razor 修改为如下所示:

@page "/counter"
@inject Data.CounterState State

<h1>Counter</h1>

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

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

@code {

    void IncrementCount()
    {
        State.CurrentCount++;
    }
}

然后将以下c#类添加到Data文件夹中 namespace BlazorCounter.Data { public class CounterState { public int CurrentCount { get; set; } } } 最后在 Startup 类的 ConfigureServices 方法末尾添加这一行:

            services.AddScoped<CounterState>();

然后你有一个计数器,它会保留它的状态并且不会在你每次导航到计数器页面时从零开始。

我的问题是:如何将其转换为“代码隐藏”并分离 C# 代码? 我已将其他剃须刀页面转换为“代码隐藏”,但看不到如何处理 @inject 行。

【问题讨论】:

    标签: asp.net-core razor dependency-injection code-behind blazor


    【解决方案1】:

    创建一个 Base 类并使用 [InjectAttribute] 注入服务:

    public class MyCounterComponent : ComponentBase
    {
    
        [Inject]
        public virtual CounterState State { get; set; }
    
        protected void IncrementCount()
        {
            State.CurrentCount++;
        }
    }
    

    我还将您的 IncrementCount() 方法从视图文件移动到此类文件。

    现在您可以将它与@inherits 指令一起使用:

    @page "/counter"
    @inherits BlazorApp1.Pages.MyCounterComponent
    
    <h1>Counter</h1>
    
    <p>Current count: @State.CurrentCount</p>
    
    <button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
    

    更多详情请见Request a service in a componentUse DI in services

    【讨论】:

    • 您的回答效果很好!此 Blazor 组件保留所有网页的计数器状态。如何创建一个保留每页计数的组件?
    • @HalHeinrich 似乎没有可用的内置组件范围服务。但作为一种解决方法,我们可以注入 IServiceProvider 并通过 sp.CreateScope() 创建一个新范围。
    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 2019-03-20
    • 2020-04-12
    • 2020-06-03
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2018-11-28
    相关资源
    最近更新 更多