EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

如何在 Blazor 應用中檢測裝置類型(如行動裝置或桌面裝置)

發現在代網頁應用程式時,根據使用者的裝置類型(如行動裝置或桌面裝置)來調整使用者體驗是一個常見的需求。本文將教大家如何在 Blazor Server 中使用 IHttpContextAccessor 來檢測使用者的裝置類型,並根據檢測結果提供不同的呈現方式。


解決方案概述

我們將透過以下步驟實現這個功能:

  1. 注入 IHttpContextAccessor 來取得 HTTP 請求中的 User-Agent 標頭。

  2. 分析 User-Agent 字串,判斷使用者是否來自行動裝置。

  3. 根據檢測結果顯示不同的內容。

以下是完整的程式碼範例:

Program.cs:

// 組件中注入 IHttpContextAccessor 並讀取 User-Agent
builder.Services.AddHttpContextAccessor();

YourPage.razor:

@inject IHttpContextAccessor HttpContextAccessor

@code {
    private string? UserAgent { get; set; }
    private bool IsMobile { get; set; }

    protected override void OnInitialized()
    {
        UserAgent = HttpContextAccessor.HttpContext?.Request.Headers["User-Agent"].ToString();

        // 判斷是否為手機
        IsMobile = UserAgent != null &&
                   (UserAgent.Contains("Mobi") || UserAgent.Contains("Android") || UserAgent.Contains("iPhone"));
    }
}

<h3>Device Type: @(IsMobile ? "Mobile" : "PC")</h3>

這樣,當使用者開啟應用程式時,頁面會自動判斷並顯示其裝置類型。


在 Blazor WebAssembly 中的注意事項

Blazor WebAssembly 的應用程式是在使用者的瀏覽器中執行的,因此無法直接使用 IHttpContextAccessor。不過,您可以改用 JavaScript 與 .NET 互操作的方式來實現類似功能。

以下是 WebAssembly 版本的範例:

JavaScript 檔案

wwwroot 資料夾中新增一個 JavaScript 檔案,內容如下:

function getUserAgent() {
    return navigator.userAgent;
}

修改 Razor 元件程式碼

在 Blazor WebAssembly 中,我們使用 IJSRuntime 與 JavaScript 互操作:

@inject IJSRuntime JSRuntime

@code {
    private string? UserAgent { get; set; }
    private bool IsMobile { get; set; }

    protected override async Task OnInitializedAsync()
    {
        UserAgent = await JSRuntime.InvokeAsync<string>("getUserAgent");

        // 判斷是否為手機
        IsMobile = UserAgent != null &&
                   (UserAgent.Contains("Mobi") || UserAgent.Contains("Android") || UserAgent.Contains("iPhone"));
    }
}

<h3>裝置類型:@(IsMobile ? "行動裝置" : "桌面裝置")</h3>

 

This article was last edited at 2025-01-19 15:43:50

Today's comments have reached the limit. If you want to comment, please wait until tomorrow (UTC-Time).

There is 14h57m49s left until you can comment.