خطا در اجرای دستورات جاوا اسکریپت در Blazor
با سلام خدمت دوستان.
بنده یک پروژه Blazor Server Side دارم و بنا به دلایلی مجبورم یک تابع جاوااسکریپت رو در OnInitialized یک کامپوننت اجرا کنم. اما چون در این متد هنوز تمام صفحه Html رندر نشده تابع جاوااسکریپت با خطا مواجه میشه. و مجبورم در تابع OnAfterRender کامپوننت، تابع خودم رو اجرا کنم. اما چون در این متد تمام صفحه رندر شده دیکه این تابع به کارم نمیاد چون حتما باید قبل از رندر شدن کامپوننت این تابع اجرا بشه.
لطفا اگه کسی راه حل این مشکل رو میدونه راهنمایی کنه
با تشکر
protected override async Task OnInitializedAsync()
{
string myCkookie = await JsRuntime.InvokeAsync<string>("ReadCookie.ReadCookie", "Value");
}
ویرایش سوال:
متن خطا به شرح زیر است:
InvalidOperationException: JavaScript interop calls cannot be issued at this time. This is because the component is being statically rendered. When prerendering is enabled, JavaScript interop calls can only be performed during the OnAfterRenderAsync lifecycle method.
پاسخ هوش مصنوعی
برای حل این مشکل، می توانید از متد OnAfterRenderAsync
استفاده کنید و شرطی قرار دهید که در اولین بار اجرای رندر، تابع جاوااسکریپت شما با استفاده از JSRuntime
اجرا شود. این کار باعث می شود که تابع شما در هر بار رندر فقط یک مرتبه اجرا شود و همچنین قبل از رندر شدن، به سادگی ای که انتظار دارید، اجرا می شود.
در زیر کد پیشنهادی برای این کار آورده شده است:
private bool isFirstRender = true;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
string myCkookie = await JsRuntime.InvokeAsync<string>("ReadCookie.ReadCookie", "Value");
isFirstRender = false; // برای جلوگیری از اجرای مجدد در رندرهای بعدی
}
}
در این کد، با بررسی شرط firstRender
، فقط در اولین بار رندر، تابع جاوااسکریپت شما فراخوانی می شود.
امیدوارم این راهکار به شما کمک کند!
دلیل خطای 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 جاوا اسکریپت رو صدا بزنید.
سلام و وقت بخیر
بله همون طور که دوستمون 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;
}
با این روش دیگه خطایی دریافت نخواهید کرد.
موفق باشید.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- کار با CkEditor با قابلیت آپلود عکس
- خطا در ایجاد migration در Asp.net core
- تفاوت های Asp.net core و Asp.net mvc چیه؟
- دلیل اسپم شدن ایمیل های ارسالی از سرور
- نحوه لایه بندی پروژه Core و اضافه کردن به IIS
- ارسال ایمیل در Asp.net core
- آیا میشه در mvc core از کامپونت استفاده کرد
- آپلود فایل در Asp.net core چگونه است؟
- حذف کامل یک رکورد در جدول ریلیشن شده
- اشکال در آپلود فایل ویدیو در mvc core 2