2 votes

Hébergement du serveur Blazor, exception de référence nulle sur le getter

Je teste le serveur blazor (.net 6.05) sur un de nos projets et j'ai le code suivant :

@page "/"
@using Microsoft.EntityFrameworkCore

@using Microsoft.JSInterop
@inject IDbContextFactory<MyDbContext> DbContextFactory;

@code {
    [Inject]
    private IHttpContextAccessor HttpContextAccessor { get; set; } = default!;

    MyDbContextContext { get; set; }
    public Dish? RandomDish { get; set; }
    public Region? Region { get; set; }

    async Task getRandomDish()
    {
        var dish = await Context.Dishes.OrderBy(m => Guid.NewGuid()).FirstOrDefaultAsync();
        RandomDish = dish;
    }

    async Task SaveDishName()
    {
        await Context.SaveChangesAsync();
    }

    protected override async Task OnInitializedAsync()
    {

        var a = HttpContextAccessor.HttpContext.User.Identity;
        Context = await DbContextFactory.CreateDbContextAsync();
        Region = await Context.Regions.SingleOrDefaultAsync(m => m.Name == "Italy");
        await getRandomDish();

    }
     protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (!firstRender) return;

    }
}

<PageTitle>Index</PageTitle>

@if (RandomDish != null)
{
    <h1>@RandomDish?.Name</h1>
    <h2>@RandomDish?.DishId</h2>
    <p>@Region?.Borders?.AsText()</p>
}<-- it errors here
<button @onclick="@(async () => await getRandomDish())">GET NEW DISH</button>

<div>
    Change dish name
    <input @bind="RandomDish.Name" />
    <button @onclick="@(async () => await SaveDishName())">Save</button>
</div>

Lorsque j'exécute le code, l'exception suivante se produit

System.NullReferenceException : 'La référence de l'objet ne correspond pas à une instance d'un objet".

****.Cms.Web.Pages.Index.RandomDish.get a retourné null.

J'ai également essayé "is not null" et referenceEquals(RandomDish, null), mais toujours le même problème.

Comment suis-je supposé faire une vérification de nullité, si les getters jettent des nullités :/

Le problème disparaît si j'initialise le plat avec la ligne sous, mais ce n'est pas une solution à un problème je suppose.

public Dish? RandomDish { get; set; } = new Dish();

enter image description here

1voto

Patrick Szalapski Points 1756

Êtes-vous sûr que vos expressions dans le balisage sont interprétées correctement ? Essayez @(RandomDish?.Name) y @(RandomDish?.DishId) juste pour être sûr. Je soupçonne que @RandomDish?.Name pourrait être interprété comme @RandomDish alors un littéral "?.Name" .

1voto

Henk Holterman Points 153608

Vous ne pouvez pas avoir un null dans @bind .

<input @bind="RandomDish.Name" />

Entourer le bloc Save de @if (RandomDish != null) ou quelque chose de similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X