Blazor一個簡單的示例讓我們來起飛

来源:https://www.cnblogs.com/yyfh/archive/2020/05/05/12833465.html
-Advertisement-
Play Games

Blazor Blazor他是一個開源的Web框架,不,這不是重點,重點是它可以使c 開發在瀏覽器上運行Web應用程式.它其實也簡化了SPA的開發過程. Blazor = Browser + Razor 為什麼選擇Blazor? Blazor可以讓.NET附有全棧開發功能,它可以使Web開發變得輕鬆 ...


Blazor

Blazor他是一個開源的Web框架,不,這不是重點,重點是它可以使c#開發在瀏覽器上運行Web應用程式.它其實也簡化了SPA的開發過程.

Blazor = Browser + Razor

為什麼選擇Blazor?

Blazor可以讓.NET附有全棧開發功能,它可以使Web開發變得輕鬆而高效.而且Blazor是開源的,它得到了社區的大力支持,而且發展速度會很快.

它還擁有SPA的一些功能比如:

  • 路由
  • 依賴註入
  • 服務端渲染
  • Layout
    等等

創建應用

如果說無法在看到Blazor WebAssembly App那麼執行如下命令即可.

dotnet new -i Microsoft.AspNetCore.Components.WebAssembly.Templates::3.2.0-preview5.20216.8

項目結構如下所示

我們可以看到上圖中的項目結構

  • BlazorServerCRUDSample.Client:該項目工程中包含了客戶端的相關代碼頁面等文件
  • BlazorServerCRUDSample.Server:該項目工程中包含了webapi.
  • BlazorServerCRUDSample.Shared:該類庫中用於存放客戶端和服務端之間的共用代碼.

BlazorServerCRUDSample.Server

控制器代碼如下所示

    [Route("api/[controller]")]
    public class StudentController : Controller
    {
        private readonly Shared.Data.AppContext _dbcontext;

        public StudentController(Shared.Data.AppContext dbcontext)
        {
            this._dbcontext = dbcontext;
        }
        [HttpGet]
        public async Task<List<Student>> Get()
        {
            return await _dbcontext.Students.AsQueryable().ToListAsync();
        }
        [HttpGet("{id}")]
        public async Task<Student> Get(int id)
        {
            return await _dbcontext.Students.FindAsync(id);
        }
        [HttpPost]
        public async Task Post([FromBody] Student student)
        {
            student.CreateTime = DateTime.Now;
            if (ModelState.IsValid)
                await _dbcontext.AddAsync(student);
           await _dbcontext.SaveChangesAsync();
        }
        [HttpPut]
        public void Put([FromBody] Student student)
        {
            if (ModelState.IsValid)
                _dbcontext.Update(student);
            _dbcontext.SaveChanges();
        }
        [HttpDelete("delete/{id}")]
        public void Delete(int id)
        {
            var entity = _dbcontext.Students.Find(id);
            _dbcontext.Students.Remove(entity);
            _dbcontext.SaveChanges();
        }



    }
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseConfiguration(new ConfigurationBuilder()
                    .AddCommandLine(args)
                    .Build())
                .UseStartup<Startup>()
                .Build();
    }

對於Startup類,我們可以看到在開發模式下,啟動Blazor調試,並且我們可以看到我們通過UseClientSideBlazorFiles來啟動我們的客戶端Startup


    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddResponseCompression();
            services.AddDbContext<AppContext>(options =>
            {
                options.UseSqlServer("Data Source=.;Initial Catalog=BlazorServerCRUDSample;User ID=sa;Password=sa;MultipleActiveResultSets=true;");
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseResponseCompression();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBlazorDebugging();
            }

            app.UseStaticFiles();
            app.UseClientSideBlazorFiles<Client.Startup>();

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapDefaultControllerRoute();
                endpoints.MapFallbackToClientSideBlazor<Client.Startup>("index.html");
            });
        }
    }

BlazorServerCRUDSample.Client

如下所示我創建了一個列表頁面,在代碼中我們可以看到@page他定義了該頁面的url,當然在razor中也是這樣的,而且下最下麵我通過HttpClient進行我們的api調用,在這 System.Net.Http.Json這篇文章中我們也可以看到他簡直就是為了我們blazor而生的大大減少了我們的代碼量.

而且在我的代碼中最後一部分有一個@functions片段,它包含了頁面所有的業務邏輯,在我們頁面初始化時我們通過OnInitializedAsync方法進行調用我們的api然後將其進行填充賦值並填充到我們的html中.

@page "/fetchstudent"
@inject HttpClient Http
@using BlazorServerCRUDSample.Shared.Models

    <h1>Students</h1>
<p>
    <a href="/addstudent">Create New</a>
</p>
@if (students == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class='table'>
        <thead>
            <tr>
                <th>ID</th>
                <th>Name</th>
                <th>Description</th>
                <th>CreateTime</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var student in students)
            {
                <tr>
                    <td>@student.Id</td>
                    <td>@student.Name</td>
                    <td>@student.Description</td>
                    <td>@student.CreateTime</td>
                        <td>
                            <a href='/editstudent/@student.Id'>Edit</a>  |
                            <a href='/delete/@student.Id'>Delete</a>
                        </td>
                </tr>

            }
        </tbody>
    </table>
}

@functions {
    Student[] students;
    protected override async Task OnInitializedAsync()
    {
        students = await Http.GetJsonAsync<Student[]>("api/student");
    }
}  

如下代碼中我們還是對我們的頁面提供了url,其中Id是將從url中的參數傳遞到我們的@functions代碼中,在Id上面指定 [Parameter] 屬性,該屬性指定的就是url中的參數值.在這我們通過使用 @bind 來將我們的html組件和類對象進行雙向綁定.

@page "/editstudent/{Id}"
@inject HttpClient Http
@using BlazorServerCRUDSample.Shared.Models
@inject Microsoft.AspNetCore.Components.NavigationManager Navigation

    <h2>Edit Student</h2>
<hr />
<div class="row">
    <div class="col-md-4">
        <form @onsubmit="@(async () => await UpdateStudent())">
            <div class="form-group">
                <label for="Name" class="control-label">Name</label>
                <input for="Name" class="form-control" @bind="@student.Name" />
            </div>
            <div class="form-group">
                <label asp-for="Description" class="control-label">Description</label>
                <textarea asp-for="Description" class="form-control" @bind="@student.Description"> </textarea>
            </div>
            <div class="form-group">
                <input type="submit" value="Save" class="btn btn-primary" />
                <input type="submit" value="Cancel" @onclick="@cancel" class="btn btn-warning" />
            </div>
        </form>
    </div>
</div>

@functions {
    [Parameter]
    public string id { get; set; }
    public Student student = new Student();
    protected override async Task OnInitializedAsync()
    {
        student = await Http.GetJsonAsync<Student>("/api/Student/" + Convert.ToInt32(id));
    }
    protected async Task UpdateStudent()
    {
        await Http.SendJsonAsync(HttpMethod.Put, "api/Student", student);
        Navigation.NavigateTo("/fetchstudent");
    }
    void cancel()
    {
         Navigation.NavigateTo("/fetchstudent");
    }
}  

在ConfigureServices方法中,可以在依賴項註入容器中註冊本地服務。

   public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
        }

        public void Configure(IComponentsApplicationBuilder app)
        {
            app.AddComponent<App>("app");
        }
    }

BlazorWebAssemblyHost可以用於在DI容器中定義介面和實現。

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IWebAssemblyHostBuilder CreateHostBuilder(string[] args) =>
            BlazorWebAssemblyHost.CreateDefaultBuilder()
                .UseBlazorStartup<Startup>();
    }

Blazor可以基於服務端運行但是需要註意服務端的話需要為每一個客戶端打開連接,並且我們必須一直與服務端保持連接才行.如果說切換到WebAssembly客戶端版本,限制是完全不同的,但是目前來說的話他首次需要下載一些運行時文件到瀏覽器中.

通過如上代碼我們可以看到一個簡單的blazor應用程式的建立,詳細代碼的話大家可以看一下github倉庫中的內容.通過源碼的話直接啟動BlazorServerCRUDSample.Server即可,希望可以通過本示例幫助到你~共同學習共同進步.

Reference

https://github.com/hueifeng/BlazorCRUDSample

https://www.cnblogs.com/shanyou/p/12825845.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 155. 最小棧 題目 設計一個支持 push ,pop ,t ...
  • 前面寫了個cassandra-appender,一個基於cassandra的logback插件。正是cassandra的分散式資料庫屬性才合適作為akka-cluster-sharding分散式應用的logger。所以,cassandra-appender核心功能就是對logback消息的存寫部分了 ...
  • 簡介 首先說說, 這個是幹啥的. 我見過很多的項目中, 用PHP文件做配置的, 一個config目錄下可能有十幾個甚至數十個.php配置文件, 裡面都是各種各樣的array, 還有甚者會把一些詞典文件(比如中文/英文對照)也放到配置中去. 這就導致配置文件的解析耗費了很大的性能(誠然, 用了opca ...
  • 我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 面試題29. 順時針列印矩陣 與以下題目相同 前往:LeetC ...
  • 我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 54. 螺旋矩陣 題目 給定一個包含 m x n 個元素的矩陣 ...
  • AE : Concrete syntax AE : Abstract syntax parse : sexp AE interp : AE number ...
  • 我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 面試題28. 對稱的二叉樹 與以下題目相同 前往:LeetCo ...
  • 我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 101. 對稱二叉樹 題目 給定一個二叉樹,檢查它是否是鏡像對 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...