خطا در اجرای دستورات جاوا اسکریپت در 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.
دلیل خطای 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;
}
با این روش دیگه خطایی دریافت نخواهید کرد.
موفق باشید.
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- نمایش صفحه در پنجره جدید با کلیک روی لینک (تگ a) در Asp
- افزودن مقادیر به صورت دستی به List دریافت شده از ریپازیتوری
- کار با CkEditor با قابلیت آپلود عکس
- خطا در ایجاد migration در Asp.net core
- تفاوت های Asp.net core و Asp.net mvc چیه؟
- دلیل اسپم شدن ایمیل های ارسالی از سرور
- نحوه لایه بندی پروژه Core و اضافه کردن به IIS
- ارسال ایمیل در Asp.net core
- آیا میشه در mvc core از کامپونت استفاده کرد
- آپلود فایل در Asp.net core چگونه است؟
- حذف کامل یک رکورد در جدول ریلیشن شده
- اشکال در آپلود فایل ویدیو در mvc core 2