From c7f9adf4d20e470338737220bf5d8f7ed6b5f2e3 Mon Sep 17 00:00:00 2001 From: Luke Latham <1622880+guardrex@users.noreply.github.com> Date: Mon, 22 Apr 2019 17:32:28 -0500 Subject: [PATCH] Blazor Overview updates (#12106) --- aspnetcore/blazor/index.md | 119 +++++++++++---------- aspnetcore/blazor/index/_static/dialog.png | Bin 0 -> 22674 bytes 2 files changed, 65 insertions(+), 54 deletions(-) create mode 100644 aspnetcore/blazor/index/_static/dialog.png diff --git a/aspnetcore/blazor/index.md b/aspnetcore/blazor/index.md index 99275fc1de99..c11f0f99ea04 100644 --- a/aspnetcore/blazor/index.md +++ b/aspnetcore/blazor/index.md @@ -4,92 +4,95 @@ author: guardrex description: Explore ASP.NET Core Blazor, a way to build interactive client-side web UI with .NET in an ASP.NET Core app. monikerRange: '>= aspnetcore-3.0' ms.author: riande -ms.custom: seoapril2019 -ms.date: 04/18/2019 +ms.custom: "mvc, seoapril2019" +ms.date: 04/22/2019 uid: blazor/index --- # Introduction to Blazor By [Daniel Roth](https://github.com/danroth27) and [Luke Latham](https://github.com/guardrex) -Welcome to Blazor! +*Welcome to Blazor!* -Build interactive client-side web UI with .NET: +Blazor is a framework for building interactive client-side web UI with .NET: -* Build rich interactive UIs using C# instead of JavaScript. +* Create rich interactive UIs using C# instead of JavaScript. * Share server-side and client-side app logic written with .NET. * Render the UI as HTML and CSS for wide browser support, including mobile browsers. -Blazor supports core scenarios required by most apps: +Using .NET for client-side web development offers the following advantages: -* Parameters -* Event handling -* Data binding -* Routing -* Dependency injection -* Layouts -* Templates -* Cascading values +* Write code in C# instead of JavaScript. +* Leverage the existing .NET ecosystem of .NET libraries. +* Share app logic across the server and client. +* Benefit from .NET's performance, reliability, and security. +* Stay productive with Visual Studio on Windows, Linux, and macOS. +* Build on a common set of languages, frameworks, and tools that are stable, feature-rich, and easy to use. ## Components -A *component* in Blazor is an element of UI, such as a page, dialog, or data entry form. Components handle user events and define flexible UI rendering logic. Components can be nested and reused. +Blazor apps are based on *components*. A component in Blazor is an element of UI, such as a page, dialog, or data entry form. Components handle user events and define flexible UI rendering logic. Components can be nested and reused. -Components are .NET classes built into .NET assemblies that can be shared and distributed as NuGet packages. The component class is usually written in the form of a Razor markup page with a *.razor* file extension. Components in Blazor are sometimes referred to as Razor components. +Components are .NET classes built into .NET assemblies that can be shared and distributed as [NuGet packages](/nuget/what-is-nuget). The component class is usually written in the form of a Razor markup page with a *.razor* file extension. -[Razor](xref:mvc/views/razor) is a syntax for combining HTML markup with C# code. Razor is designed for developer productivity, allowing the developer to switch between markup and C# in the same file with [IntelliSense](/visualstudio/ide/using-intellisense) support. Razor Pages and MVC views also use Razor. Unlike Razor Pages and MVC views, which are built around a request/response model, components are used specifically for handling UI composition. Razor components can be used specifically for client-side UI logic and composition. +Components in Blazor are sometimes referred to as *Razor components*. [Razor](xref:mvc/views/razor) is a syntax for combining HTML markup with C# code designed for developer productivity. Razor allows you to switch between HTML markup and C# in the same file with [IntelliSense](/visualstudio/ide/using-intellisense) support. Razor Pages and MVC also use Razor. Unlike Razor Pages and MVC, which are built around a request/response model, components are used specifically for client-side UI logic and composition. -The following markup is an example of a custom dialog component: +The following Razor markup demonstrates a component (*Dialog.razor*), which can be nested within another component: ```cshtml
-

@Title

- @BodyContent - +

@Title

+ + @ChildContent + +
@functions { + [Parameter] public string Title { get; set; } - public RenderFragment BodyContent { get; set; } - public Action OnOK { get; set; } + + [Parameter] + public RenderFragment ChildContent { get; set; } + + private void OnYes() + { + Console.WriteLine("Write to the console in C#!"); + } } ``` -When this component is used elsewhere in the app, IntelliSense in [Visual Studio](https://visualstudio.microsoft.com/vs/) speeds development with syntax and parameter completion. - -Components render into an in-memory representation of the browser DOM called a *render tree* that can then be used to update the UI in a flexible and efficient way. +The dialog's body content (`ChildContent`) and title (`Title`) are provided by the component that uses this component in its UI. `OnYes` is a C# method triggered by the button's `onclick` event. -## Blazor server-side +Blazor uses natural HTML tags for UI composition. HTML elements specify components, and a tag's attributes pass values to a component's properties. `ChildContent` and `Title` are set by the component that uses the Dialog component (*Index.razor*): -Blazor decouples component rendering logic from how UI updates are applied. Blazor server-side provides support for hosting Razor components on the server in an ASP.NET Core app. UI updates are handled over a SignalR connection. +```cshtml +@page "/" -The runtime: +

Hello, world!

-* Handles sending UI events from the browser to the server. -* Applies UI updates sent by the server back to the browser after running the components. +Welcome to your new app. -The connection used by Blazor server-side to communicate with the browser is also used to handle JavaScript interop calls. + + Do you want to learn more about Blazor? + +``` -![Blazor server-side runs .NET code on the server and interacts with the Document Object Model on the client over a SignalR connection](index/_static/blazor-server-side.png) +The dialog is rendered when the parent (*Index.razor*) is accessed in a browser: -For more information, see . +![Dialog component rendered in the browser](index/_static/dialog.png) -## Blazor client-side +When this component is used in the app, IntelliSense in [Visual Studio](/visualstudio/ide/using-intellisense) and [Visual Studio Code](https://code.visualstudio.com/docs/editor/intellisense) speeds development with syntax and parameter completion. -Blazor client-side is a single-page app framework for building interactive client-side Web apps with .NET. Blazor client-side uses open web standards without plugins or code transpilation. Blazor client-side works in all modern web browsers, including mobile browsers. +Components render into an in-memory representation of the browser DOM called a *render tree* that's used to update the UI in a flexible and efficient way. -Using .NET in the browser for client-side web development offers many advantages: +## Blazor client-side -* **C# language**: Write code in C# instead of JavaScript. -* **.NET Ecosystem**: Leverage the existing ecosystem of .NET libraries. -* **Full-stack development**: Share server and client-side logic. -* **Speed and scalability**: .NET was built for performance, reliability, and security. -* **Industry-leading tools**: Stay productive with Visual Studio on Windows, Linux, and macOS. -* **Stability and consistency**: Build on a common set of languages, frameworks, and tools that are stable, feature-rich, and easy to use. +Blazor client-side is a single-page app framework for building interactive client-side web apps with .NET. Blazor client-side uses open web standards without plugins or code transpilation and works in all modern web browsers, including mobile browsers. Running .NET code inside web browsers is made possible by [WebAssembly](http://webassembly.org) (abbreviated *wasm*). WebAssembly is an open web standard and supported in web browsers without plugins. WebAssembly is a compact bytecode format optimized for fast download and maximum execution speed. -WebAssembly code can access the full functionality of the browser via JavaScript interop. At the same time, .NET code executed via WebAssembly runs in the same trusted sandbox as JavaScript to prevent malicious actions on the client machine. +WebAssembly code can access the full functionality of the browser via JavaScript, called *JavaScript interoperability* (or *JavaScript interop*). .NET code executed via WebAssembly in the browser runs in the same trusted sandbox as JavaScript, which virtually eliminates the opportunity for an app to perform malicious actions on the client machine. ![Blazor client-side runs .NET code in the browser with WebAssembly.](index/_static/blazor-client-side.png) @@ -97,27 +100,35 @@ When a Blazor client-side app is built and run in a browser: * C# code files and Razor files are compiled into .NET assemblies. * The assemblies and the .NET runtime are downloaded to the browser. -* Blazor client-side bootstraps the .NET runtime and configures the runtime to load the assemblies for the app. Document Object Model (DOM) manipulation and browser API calls are handled by the Blazor client-side runtime via JavaScript interop. +* Blazor client-side bootstraps the .NET runtime and configures the runtime to load the assemblies for the app. The Blazor client-side runtime uses JavaScript interop to handle Document Object Model (DOM) manipulation and browser API calls. -To reduce the size of the downloaded app, unused code is stripped out of the app when it's published by the [Intermediate Language (IL) Linker](xref:host-and-deploy/blazor/configure-linker). +The size of the published app, its *payload size*, is a critical performance factor for an app's useability. A large app takes a relatively long time to download to a browser, which hurts the user experience. Blazor client-side optimizes payload size to reduce download times: -Blazor client-side is a client-side hosting model. Because Blazor decouples a component's rendering logic from how UI updates are applied, there's flexibility in how Blazor can be hosted. Use [Blazor server-side](#blazor-server-side) to host Blazor on the server in an ASP.NET Core app where UI updates are handled over a SignalR connection. For more information, see . - -Payload size is a critical performance factor for an app's useability. Blazor client-side optimizes payload size to reduce download times: - -* Unused parts of .NET assemblies are removed during the build process. +* Unused code is stripped out of the app when it's published by the [Intermediate Language (IL) Linker](xref:host-and-deploy/blazor/configure-linker). * HTTP responses are compressed. * The .NET runtime and assemblies are cached in the browser. -[Blazor server-side](#blazor-server-side) provides a smaller payload size than Blazor client-side by maintaining .NET assemblies, the app's assembly, and the runtime server-side. Blazor server-side apps only serve markup files and static assets to clients. +For more information and guidance on choosing a hosting model, see . + +## Blazor server-side + +Blazor decouples component rendering logic from how UI updates are applied. Blazor server-side provides support for hosting Razor components on the server in an ASP.NET Core app. UI updates are handled over a [SignalR](xref:signalr/introduction) connection. + +The runtime handles sending UI events from the browser to the server and applies UI updates sent by the server back to the browser after running the components. + +The connection used by Blazor server-side to communicate with the browser is also used to handle JavaScript interop calls. + +![Blazor server-side runs .NET code on the server and interacts with the Document Object Model on the client over a SignalR connection](index/_static/blazor-server-side.png) + +For more information and guidance on choosing a hosting model, see . ## JavaScript interop -For apps that require third-party JavaScript libraries and browser APIs, components interoperate with JavaScript. Components are capable of using any library or API that JavaScript is able to use. C# code can call into JavaScript code, and JavaScript code can call into C# code. For more information, see [JavaScript interop](xref:blazor/javascript-interop). +For apps that require third-party JavaScript libraries and browser APIs, components interoperate with JavaScript. Components are capable of using any library or API that JavaScript is able to use. C# code can call into JavaScript code, and JavaScript code can call into C# code. For more information, see . ## Code sharing and .NET Standard -Apps can reference and use existing [.NET Standard](/dotnet/standard/net-standard) libraries. .NET Standard is a formal specification of .NET APIs that are common across .NET implementations. Blazor implements .NET Standard 2.0. APIs that aren't applicable inside a web browser (for example, accessing the file system, opening a socket, threading, and other features) throw . .NET Standard class libraries can be shared across different .NET platforms, such as Blazor, .NET Framework, .NET Core, Xamarin, Mono, and Unity. +Apps can use [.NET Standard](/dotnet/standard/net-standard) libraries. .NET Standard is a formal specification of .NET APIs that are common across .NET implementations. Blazor implements .NET Standard 2.0. APIs that aren't applicable inside a web browser (for example, accessing the file system, opening a socket, and threading) throw a . .NET Standard class libraries can be shared across different .NET platforms, such as Blazor, .NET Framework, .NET Core, Xamarin, Mono, and Unity. ## Additional resources diff --git a/aspnetcore/blazor/index/_static/dialog.png b/aspnetcore/blazor/index/_static/dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..cdf468e3a29b28b24dddc28a511027adfc752b30 GIT binary patch literal 22674 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 A)Bpeg literal 0 HcmV?d00001