دسته بندی ها
15:05 1401/01/19

خطا در اجرای دستورات جاوا اسکریپت در Blazor

مشخصات سوال کننده :
کاربر : Parsa_Hassani     امتیاز کاربر : 18     رتبه کاربر : 40
دسته بندی : Asp.net Core Blazor جاوا اسکریپت

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 4309
1 نظر
pedram_khan : "اما چون در این متد هنوز تمام صفحه Html رندر نشده تابع جاوااسکریپت با خطا مواجه میشه" .... خب اون خطایی که دارید رو هم قرار بدید. قطعا توی پاسخگویی خیلی میتونه کمک کنه.

امتیاز کاربر : 277   رتبه کاربر : 6   تاریخ ثبت : 06:44 1401/01/19
پاسخ دهنده : fateme 03:07 1401/01/20

دلیل خطای  JavaScript interop calls can only be performed during the OnAfterRenderAsync lifecycle method در Blazor

ببینید یکی از دلایلی که از بلیزر استفاده میشه در واقع حذف JavaScript بوده. خب وقتی شما از بلیزر استفاده کردی پذیرفتید که جاوااسکریپت رو نمیخواید. بنابراین بهتره هر کاری که میخواید انجام بدید با همون Blazor انجام بدید.

از دستور StateHasChanged استفاده کنید ببینید جواب میده یا نه.

protected override async Task OnInitializedAsync()
{
   string myCkookie = await JsRuntime.InvokeAsync<string>("ReadCookie.ReadCookie", "Value");
   StateHasChanged();
}

البته من فکر میکنم باید در OnAfterRender جاوا اسکریپت رو صدا بزنید.

به این پاسخ امتیاز بدهید    3
امتیاز: 1617 رتبه: 2
1 نظر
Parsa_Hassani : ممنون بابت پاسختون، بله حق با شماست باید در OnAfterRender اجرا بشه، راه دیگه ای نداره!

امتیاز کاربر : 18   رتبه کاربر : 40   تاریخ ثبت : 11:34 1401/01/20
پاسخ دهنده : Sowgandi 18:40 1401/01/20

سلام  و وقت بخیر

بله همون طور که دوستمون fateme فرمودند وقتی از Blazor استفاده می کنید تا جایی که میتونید از خود کدهای سی شارپ استفاده کنید و استفاده از JavaScript رو محدود کنید، مگر در مواقعی که چاره ای جزء استفاده از جاوا اسکریپت را نداشته باشید.
توابع JavaScript در پروژه های Blazor Server و در متد چرخه حیات  OnInitialized اجرا نمی شوند، چون همان طور که خودتون فرمودید هنوز کامپوننت و صفحه HTML رندر نشده و صدا زدن این متد باعث خطا خواهد شد. ولی در پروژه های Blazor Client موضوع متفاوت است.

 طبق کدهایی که شما قرار دادید، فکر میکنم قصد فراخوانی یک Cookie را دارید که این کار توسط HttpContext هم در بلیزر قابل اجرا هست.

اگر فقط  قصد دارید برای این کار از JavaScript استفاده کنید به روش زیر عمل کنید.

1- سرویس زیر رو به فایل program.cs پروژه خودتون اضافه کنید.

builder.Services.AddHttpContextAccessor();

2- در کامپوننت خودتون از Inject زیر استفاده کنید.

@inject IHttpContextAccessor Http

3- حالا در هر متدی که دوست دارید میتونید کوکی خودتون رو فراخوانی کنید.

 protected override void OnInitialized()
 {
    string cookie = Http.HttpContext.Request.Cookies.Where(x => x.Key == "Login_ID").SingleOrDefault().Value;
 }

با این روش دیگه خطایی دریافت نخواهید کرد.

موفق باشید.

ویرایش شده در شنبه 20 فروردین 1401 ساعت 18:41:41
به این پاسخ امتیاز بدهید    3
امتیاز: 871 رتبه: 3
1 نظر
Parsa_Hassani : ممنون دوست گرامی مشکلم حل شد با این کد. لطف کردید

امتیاز کاربر : 18   رتبه کاربر : 40   تاریخ ثبت : 08:36 1401/01/20
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود