Blazor帶我重玩前端(四)

佈局

Blazor中的佈局和MVC中的佈局是相似的。web

建立佈局

新建一個Razor頁面,全部新增的佈局都要繼承LayoutComponentBase,同時標識自定義內容的輸出位置,即標識Body的位置。如圖所示:瀏覽器

應用佈局

咱們修改一下index.razor頁面中的代碼,增長@layout MyLayout。運行後,按F12查看網頁源代碼以下:佈局的內容被<app></app>標籤包着,這也意味着,咱們的layout並非頁面的所有內容,而僅僅只是blazor相關的內容。
順便說一下,佈局是能夠「繼承」的,也就是說,咱們能夠聲明一個新的佈局繼承自MainLayout.razor ,只須要指定以下代碼便可:微信

@inherits LayoutComponentBase
@layout MainLayout

路由

路由定義

路由模板

定義在App.razor中:app

<Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
    </Found>
    <NotFound>
        <LayoutView Layout="@typeof(MainLayout)">
            <p>Sorry, there's nothing at this address.</p>
        </LayoutView>
    </NotFound>
</Router>

裏面有三個重要組件:編輯器

  • Found:路由機制渲染存在的頁面
  • RouteView:接收路由數據和默認的佈局
  • NotFound:路由機制渲染不存在的頁面,固然咱們能夠本身定義404內容

定義路由

路由定義很簡單,只須要前綴@page,而後定義你的路由名稱便可,如@page 「index」。固然一個頁面能夠定義多個路由。以下:ide

  • @page 「/index」
  • @page 「/」
  • @page 「/home/index」

定義與約束路由參數

這個其實和ASP.NET Core API的路由方式沒有太大區別,包括路由約束部分。佈局

@page "/Index/{Theme}"

接收參數的方式也很簡單,須要聲明一個get;set的屬性,而且必須是public的,同時須要用Parameter特性去標識。flex

@{
 [Parameter]
 public string Theme{get;set;}
}

如下是路由約束,相比於MVC,這些約束也沒什麼變化。this

咱們先看一個例子

<div class="@NavMenuCssClass" @onclick="@ToggleNavMenu">
    <ul class="nav flex-column">
        <li class="nav-item px-3">
   <NavLink class="nav-link" href="" Match="NavLinkMatch.All">
                <span class="oi oi-home" aria-hidden="true"></span> Home
            </NavLink>
        </li>
        <li class="nav-item px-3">
   <NavLink class="nav-link" href="MyComponent" Match="NavLinkMatch.Prefix">
                <span class="oi oi-plus" aria-hidden="true"></span> My Component
            </NavLink>
        </li>
    </ul>
</div> 

NavLinkMatch有兩個枚舉:spa

  • NavLinkMatch.All:當匹配整個URL時,能夠路由到頁面
  • NavLinkMatch.Prefix:這是默認使用的,當匹配到當前URL的前綴時,能夠路由到頁面。如https://localhost:5001/MyComponent和 https://localhost:5001/MyComponent/AnotherSegment 接下來咱們看一下若是經過代碼方式進行頁面跳轉,那就是可使用NavigationManager進行頁面跳轉,其實例是經過注入獲取的。
@inject NavigationManager NavigationManager
成員 描述
Uri 獲取當前的絕對URL
BaseUri 獲取根URI(末尾帶斜槓),而後以此追加相對路徑進而組合成絕對URI
NavigateTo 導航到指定的 URI(前提是設置forceLoad 爲true),使用此方式,會繞過客戶端路由,使得瀏覽器會強制刷新頁面,如:UriHelper.NavigateTo("/DataList/" + Index, forceLoad);
LocationChanged 當導航位置更改時觸發的事件
ToAbsoluteUri 將相對 URI 轉換爲絕對 URI
ToBaseRelativePath 給定一個根 URI(例如,之前由BaseUri返回的 URI),將絕對 URI 轉換爲帶有根URI 前綴的相對 URI

其餘

Blazor雖然提供了十分豐富而又靈活的路由功能,但目前尚未一個明確的功能讓咱們使用可選參數,可是咱們能夠變通一下,就是設置接收的數據類型爲可空類型。代碼以下:

@page 「DataList/{Index:int}」
[Parameter]
public int? Index { get; set; }
protected override void OnInitialized()
{
  base.OnInitialized();
  Index = Index?? 1;
}


本文分享自微信公衆號 - dotNET跨平臺(opendotnet)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索