طراحی صفحات 404 سفارشی در برنامههای وب Blazor نسخه .NET 8 و جدیدتر
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۱/۲۸ ۱۲:۵۴
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
<NotFound> در کامپوننت Router، دیگر کارایی ندارند. <NotFound> در کامپوننت Router امکانپذیر بود. کد زیر نمونهای از این رویکرد در نسخههای قدیمیتر است:<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>این صفحه یافت نشد. لطفاً آدرس را بررسی کنید.</p>
</LayoutView>
</NotFound>
</Router><NotFound> بهعنوان صفحه 404 نمایش داده میشد. با این حال، در مدل جدید Blazor Web App که در .NET 8 معرفی شده است، این روش دیگر پشتیبانی نمیشود. دلیل آن تغییر در نوع Router و استفاده از اسکریپت blazor.web.js بهجای blazor.server.js یا blazor.webassembly.js است. این تغییر به توسعهدهندگان امکان میدهد تا از ترکیب رندر سمت سرور (Server-Side Rendering یا SSR)، رندر سمت کلاینت (Client-Side Rendering یا CSR) و رندر استاتیک (Static SSR) در یک برنامه استفاده کنند، اما تگ <NotFound> دیگر بهدرستی عمل نمیکند.NotFoundPage.razor ایجاد میکنیم که از یک الگوی مسیر (Route Template) با مشخصه nonfile استفاده میکند. کد زیر نمونهای از این صفحه است:@page "/{*route:nonfile}"
<h1>صفحه یافت نشد</h1>
<p>متأسفانه صفحهای که به دنبال آن هستید وجود ندارد. لطفاً آدرس را بررسی کنید یا به <a href="/">صفحه اصلی</a> بازگردید.</p>
@code {
[Parameter]
public string? Route { get; set; }
}/ {*route:nonfile}: این الگو به Blazor میگوید که هر مسیر غیرمعتبر (که به یک فایل فیزیکی اشاره ندارد) را به این صفحه هدایت کند. مشخصه nonfile تضمین میکند که درخواستهای مربوط به فایلهای استاتیک (مانند تصاویر یا CSS) به این صفحه هدایت نشوند.app.UseStatusCodePagesWithReExecute("/not-found");/not-found هدایت میکند، که میتواند همان NotFoundPage.razor باشد.@page "/{*route:nonfile}"
@layout MainLayout
@inject ILogger<NotFoundPage> Logger
<h1>صفحه یافت نشد</h1>
<p>متأسفانه صفحهای که به دنبال آن هستید وجود ندارد.</p>
@code {
[Parameter]
public string? Route { get; set; }
protected override void OnInitialized()
{
Logger.LogWarning($"Requested invalid route: {Route}");
}
}