Skip to content

Commit 745ce48

Browse files
authored
Clarification on using the @ prefix (#34570)
1 parent 01537d2 commit 745ce48

File tree

1 file changed

+44
-33
lines changed

1 file changed

+44
-33
lines changed

aspnetcore/blazor/components/index.md

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -727,45 +727,54 @@ The `Heading` component example shown in this section doesn't have an [`@page`][
727727

728728
## Component parameters
729729

730-
*Component parameters* pass data to components and are defined using public [C# properties](/dotnet/csharp/programming-guide/classes-and-structs/properties) on the component class with the [`[Parameter]` attribute](xref:Microsoft.AspNetCore.Components.ParameterAttribute). In the following example, a built-in reference type (<xref:System.String?displayProperty=fullName>) and a user-defined reference type (`PanelBody`) are passed as component parameters.
730+
*Component parameters* pass data to components and are defined using public [C# properties](/dotnet/csharp/programming-guide/classes-and-structs/properties) on the component class with the [`[Parameter]` attribute](xref:Microsoft.AspNetCore.Components.ParameterAttribute).
731731

732-
`PanelBody.cs`:
732+
In the following `ParameterChild` component, component parameters include:
733733

734-
:::moniker range=">= aspnetcore-9.0"
734+
* Built-in reference types.
735735

736-
:::code language="csharp" source="~/../blazor-samples/9.0/BlazorSample_BlazorWebApp/PanelBody.cs":::
736+
* <xref:System.String?displayProperty=fullName> to pass a title in `Title`.
737+
* <xref:System.Int32?displayProperty=fullName> to pass a count in `Count`.
737738

738-
:::moniker-end
739+
* A user-defined reference type (`PanelBody`) to pass a Bootstrap card body in `Body`.
739740

740-
:::moniker range=">= aspnetcore-8.0 < aspnetcore-9.0"
741+
`PanelBody.cs`:
741742

742-
:::code language="csharp" source="~/../blazor-samples/8.0/BlazorSample_BlazorWebApp/PanelBody.cs":::
743+
:::moniker range=">= aspnetcore-9.0"
743744

744-
:::moniker-end
745+
:::code language="csharp" source="~/../blazor-samples/9.0/BlazorSample_BlazorWebApp/PanelBody.cs":::
745746

746-
:::moniker range=">= aspnetcore-7.0 < aspnetcore-8.0"
747+
:::moniker-end
747748

748-
:::code language="csharp" source="~/../blazor-samples/7.0/BlazorSample_WebAssembly/PanelBody.cs":::
749+
:::moniker range=">= aspnetcore-8.0 < aspnetcore-9.0"
749750

750-
:::moniker-end
751+
:::code language="csharp" source="~/../blazor-samples/8.0/BlazorSample_BlazorWebApp/PanelBody.cs":::
751752

752-
:::moniker range=">= aspnetcore-6.0 < aspnetcore-7.0"
753+
:::moniker-end
753754

754-
:::code language="csharp" source="~/../blazor-samples/6.0/BlazorSample_WebAssembly/PanelBody.cs":::
755+
:::moniker range=">= aspnetcore-7.0 < aspnetcore-8.0"
755756

756-
:::moniker-end
757+
:::code language="csharp" source="~/../blazor-samples/7.0/BlazorSample_WebAssembly/PanelBody.cs":::
757758

758-
:::moniker range=">= aspnetcore-5.0 < aspnetcore-6.0"
759+
:::moniker-end
759760

760-
:::code language="csharp" source="~/../blazor-samples/5.0/BlazorSample_WebAssembly/PanelBody.cs":::
761+
:::moniker range=">= aspnetcore-6.0 < aspnetcore-7.0"
761762

762-
:::moniker-end
763+
:::code language="csharp" source="~/../blazor-samples/6.0/BlazorSample_WebAssembly/PanelBody.cs":::
763764

764-
:::moniker range="< aspnetcore-5.0"
765+
:::moniker-end
765766

766-
:::code language="csharp" source="~/../blazor-samples/3.1/BlazorSample_WebAssembly/PanelBody.cs":::
767+
:::moniker range=">= aspnetcore-5.0 < aspnetcore-6.0"
767768

768-
:::moniker-end
769+
:::code language="csharp" source="~/../blazor-samples/5.0/BlazorSample_WebAssembly/PanelBody.cs":::
770+
771+
:::moniker-end
772+
773+
:::moniker range="< aspnetcore-5.0"
774+
775+
:::code language="csharp" source="~/../blazor-samples/3.1/BlazorSample_WebAssembly/PanelBody.cs":::
776+
777+
:::moniker-end
769778

770779
`ParameterChild.razor`:
771780

@@ -808,7 +817,7 @@ The `Heading` component example shown in this section doesn't have an [`@page`][
808817
> [!WARNING]
809818
> Providing initial values for component parameters is supported, but don't create a component that writes to its own parameters after the component is rendered for the first time. For more information, see <xref:blazor/components/overwriting-parameters>.
810819
811-
The `Title` and `Body` component parameters of the `ParameterChild` component are set by arguments in the HTML tag that renders the instance of the component. The following `ParameterParent` component renders two `ParameterChild` components:
820+
The component parameters of the `ParameterChild` component can be set by arguments in the HTML tag that renders an instance of the `ParameterChild` component. The following `ParameterParent` component renders two `ParameterChild` components:
812821

813822
* The first `ParameterChild` component is rendered without supplying parameter arguments.
814823
* The second `ParameterChild` component receives values for `Title` and `Body` from the `ParameterParent` component, which uses an [explicit C# expression](xref:mvc/views/razor#explicit-razor-expressions) to set the values of the `PanelBody`'s properties.
@@ -864,21 +873,21 @@ The `Title` and `Body` component parameters of the `ParameterChild` component ar
864873
The following rendered HTML markup from the `ParameterParent` component shows `ParameterChild` component default values when the `ParameterParent` component doesn't supply component parameter values. When the `ParameterParent` component provides component parameter values, they replace the `ParameterChild` component's default values.
865874

866875
> [!NOTE]
867-
> For clarity, rendered CSS style classes aren't shown in the following rendered HTML markup.
876+
> For clarity, most of the rendered CSS style classes and some elements aren't shown in the following rendered HTML markup. The main concept demonstrated by the following example is that the parent component assigned values to the child component using its component parameters.
868877
869878
```html
870879
<h1>Child component (without attribute values)</h1>
871880

872-
<div>
873-
<div>Set By Child</div>
874-
<div>Set by child.</div>
881+
<div>Set By Child</div>
882+
<div style="font-style:normal">
883+
<p>Card content set by child.</p>
875884
</div>
876885

877886
<h1>Child component (with attribute values)</h1>
878887

879-
<div>
880-
<div>Set by Parent</div>
881-
<div>Set by parent.</div>
888+
<div>Set by Parent</div>
889+
<div style="font-style:italic">
890+
<p>Set by parent.</p>
882891
</div>
883892
```
884893

@@ -893,12 +902,14 @@ The following `ParameterParent2` component displays four instances of the preced
893902
* The current local date in long format with <xref:System.DateTime.ToLongDateString%2A>, which uses an [implicit C# expression](xref:mvc/views/razor#implicit-razor-expressions).
894903
* The `panelData` object's `Title` property.
895904

905+
The fifth `ParameterChild` component instance also sets the `Count` parameter. Note how a `string`-typed parameter requires an `@` prefix to ensure that an expression isn't treated as a string literal. However, `Count` is a nullable integer (<xref:System.Int32?displayProperty=fullName>), so `Count` can receive the value of `count` without an `@` prefix. You can establish an alternative code convention that requires developers in your organization to always prefix with `@`. Either way, we merely recommend that you adopt a consistent approach for how component parameters are passed in Razor markup.
906+
896907
Quotes around parameter attribute values are optional in most cases per the HTML5 specification. For example, `Value=this` is supported, instead of `Value="this"`. However, we recommend using quotes because it's easier to remember and widely adopted across web-based technologies.
897908

898909
Throughout the documentation, code examples:
899910

900911
* Always use quotes. Example: `Value="this"`.
901-
* Don't use the `@` prefix with nonliterals unless required. Example: `Count="ct"`, where `ct` is a number-typed variable. `Count="@ct"` is a valid stylistic approach, but the documentation and examples don't adopt the convention.
912+
* Don't use the `@` prefix with nonliterals unless required. Example: `Count="count"`, where `count` is a number-typed variable. `Count="@count"` is a valid stylistic approach, but the documentation and examples don't adopt the convention.
902913
* Always avoid `@` for literals, outside of Razor expressions. Example: `IsFixed="true"`. This includes keywords (for example, `this`) and `null`, but you can choose to use them if you wish. For example, `IsFixed="@true"` is uncommon but supported.
903914

904915
:::moniker range=">= aspnetcore-9.0"
@@ -947,21 +958,21 @@ Throughout the documentation, code examples:
947958
> Correct (`Title` is a string parameter, `Count` is a number-typed parameter):
948959
>
949960
> ```razor
950-
> <ParameterChild Title="@title" Count="ct" />
961+
> <ParameterChild Title="@title" Count="count" />
951962
> ```
952963
>
953964
> ```razor
954-
> <ParameterChild Title="@title" Count="@ct" />
965+
> <ParameterChild Title="@title" Count="@count" />
955966
> ```
956967
>
957968
> Incorrect:
958969
>
959970
> ```razor
960-
> <ParameterChild @Title="@title" @Count="ct" />
971+
> <ParameterChild @Title="@title" @Count="count" />
961972
> ```
962973
>
963974
> ```razor
964-
> <ParameterChild @Title="@title" @Count="@ct" />
975+
> <ParameterChild @Title="@title" @Count="@count" />
965976
> ```
966977
967978
Unlike in Razor pages (`.cshtml`), Blazor can't perform asynchronous work in a Razor expression while rendering a component. This is because Blazor is designed for rendering interactive UIs. In an interactive UI, the screen must always display something, so it doesn't make sense to block the rendering flow. Instead, asynchronous work is performed during one of the [asynchronous lifecycle events](xref:blazor/components/lifecycle). After each asynchronous lifecycle event, the component may render again. The following Razor syntax is **not** supported:

0 commit comments

Comments
 (0)