دسته بندی ها
18:52 1403/12/30

رفع مشکل لود مجدد اطلاعات از سرور در Blazor

مشخصات سوال کننده :
کاربر : hakan2025     امتیاز کاربر : 3     رتبه کاربر : 136
دسته بندی : Blazor

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 378
هوش مصنوعی

پاسخ هوش مصنوعی

مسیله ای که شما با آن مواجه هستید، معمولاً به خاطر این است که `@page` با `@rendermode InteractiveServer` به صورت پیش فرض جزییاتی از وضعیت صفحه را مجدداً لود می کند و در نتیجه باعث واکشی دوباره اطلاعات از دیتابیس می شود.

برای حل این مشکل، می توانید از protected override async Task OnInitializedAsync() استفاده کنید و اطمینان حاصل کنید که این متد فقط یک بار اجرا شود. یکی از روش ها ایجاد یک متغیر برای بررسی اینکه آیا اطلاعات از قبل بارگذاری شده اند یا خیر است:

@page "/product"
@attribute [StreamRendering]
@rendermode InteractiveServer

...دستورات html نمایش کالاها
@code { ProductDto[] _products; bool _isDataLoaded = false; protected override async Task OnInitializedAsync() { if (!_isDataLoaded) { await Task.Delay(5000); _products = await DbContext.Products.ToArrayAsync(); // فرض بر این است که از EF Core استفاده می کنید _isDataLoaded = true; } } }

در این کد، با استفاده از متغیر _isDataLoaded بررسی می شود که آیا اطلاعات قبلاً بارگذاری شده اند یا نه. در صورت بارگذاری، از بارگذاری دوباره جلوگیری می شود.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : fateme 16:28 1404/01/02

مشکل کد شما این هست که StreamRendering و InteractiveServer رو با هم استفاده کردید. به طور پیش فرض خود StreamRendering باعث میشه ابتدا بخش های Static صفحه لود بشن و سپس درخواست لود اطلاعات داینامیک رو میده. اما در InteractiveServer هم یکبار دیگه درخواست لود اطلاعات داده میشه. پس عملا باعث میشه دو بار اطلاعات لود بشن.

برای رفع این مشکل باید InteractiveServer رو به صورت PreRender اجرا نکنیم. برای این کار به صورت زیر عمل کنید :

@page "/product"
@attribute [StreamRendering]
@rendermode @(new InteractiveServerRenderMode(prerender:false))

<div>
   ...دستورات html نمایش کالاها
</div>

@code {
   ProductDto[] _products;

   protected override async Task OnInitializedAsync()
   {
      await Task.Delay(5000);
      _product = DbContext.Products;
   }
}

در کد بالا خاصیت PreRender رو false کردیم تا StreamRendering و InteractiveServer همزمان با هم اجرا بشن و صفحه 2 بار لود نشه.

ویرایش شده در شنبه 2 فروردین 1404 ساعت 16:29:49
به این پاسخ امتیاز بدهید    0
امتیاز: 1635 رتبه: 2
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود