با سلام خدمت دوستان.
بنده یک پروژه 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 بوده. خب وقتی شما از بلیزر استفاده کردی پذیرفتید که جاوااسکریپت رو نمیخواید. بنابراین بهتره هر کاری که میخواید انجام بدید با همون 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;
}
با این روش دیگه خطایی دریافت نخواهید کرد.
موفق باشید.
تاریخ :
1402/04/28
- ساعت :
09:04:00 PM
- بازدید :
1313
- پاسخ :
0
|
تاریخ :
1403/12/30
- ساعت :
06:43:00 PM
- بازدید :
66
- پاسخ :
1
|
تاریخ :
1403/12/30
- ساعت :
06:52:00 PM
- بازدید :
48
- پاسخ :
1
|
تاریخ :
1403/12/27
- ساعت :
05:26:00 PM
- بازدید :
89
- پاسخ :
1
|
تاریخ :
1403/12/01
- ساعت :
01:07:00 PM
- بازدید :
175
- پاسخ :
0
|
تاریخ :
1403/11/30
- ساعت :
12:08:00 PM
- بازدید :
149
- پاسخ :
1
|
تاریخ :
1399/12/21
- ساعت :
10:20:00 AM
- بازدید :
2766
- پاسخ :
1
|
تاریخ :
1399/12/20
- ساعت :
10:32:00 AM
- بازدید :
2622
- پاسخ :
1
|
تاریخ :
1403/12/24
- ساعت :
06:18:00 PM
- بازدید :
81
- پاسخ :
1
|
تاریخ :
1403/12/26
- ساعت :
03:28:00 PM
- بازدید :
65
- پاسخ :
1
|
تاریخ :
1404/01/07
- ساعت :
05:02:00 AM
- بازدید :
89
- پاسخ :
1
|
تاریخ :
1402/04/28
- ساعت :
09:04:00 PM
- بازدید :
1313
- پاسخ :
0
|
تاریخ :
1403/12/30
- ساعت :
06:43:00 PM
- بازدید :
66
- پاسخ :
1
|
تاریخ :
1398/08/23
- ساعت :
09:16:00 PM
- بازدید :
9852
- پاسخ :
1
|
تاریخ :
1404/01/03
- ساعت :
12:18:00 PM
- بازدید :
37
- پاسخ :
1
|
تاریخ :
1404/01/03
- ساعت :
10:39:00 AM
- بازدید :
45
- پاسخ :
1
|
تاریخ :
1404/01/02
- ساعت :
05:05:00 PM
- بازدید :
59
- پاسخ :
1
|
تاریخ :
1403/12/30
- ساعت :
06:52:00 PM
- بازدید :
48
- پاسخ :
1
|
تاریخ :
1399/06/04
- ساعت :
02:25:00 PM
- بازدید :
4419
- پاسخ :
2
|
تاریخ :
1403/11/30
- ساعت :
10:36:00 AM
- بازدید :
202
- پاسخ :
2
|