ASP.NET Core Razor Pages patterns for server-rendered web apps.
ASP.NET Core Razor Pages patterns for server-rendered web applications.
.cshtml. Use handlers (OnGet, OnPost).[BindProperty] for form data. [FromQuery] for query params.asp-for, asp-action, asp-route-* for type-safe HTML.<partial> tag helper._Layout.cshtml. Use sections for page-specific content..cshtml: Move to PageModel or View Components.ViewBag/ViewData: Use strongly-typed models.@Html.AntiForgeryToken() or use asp-antiforgery.// Pages/Users/Create.cshtml.cs
public class CreateModel(IUserService userService, ILogger<CreateModel> logger) : PageModel
{
[BindProperty]
public CreateUserInput Input { get; set; } = new();
public List<SelectListItem> Roles { get; set; } = [];
public async Task OnGetAsync()
{
Roles = await GetRolesAsync();
}
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
Roles = await GetRolesAsync();
return Page();
}
var result = await userService.CreateAsync(Input);
if (!result.IsSuccess)
{
ModelState.AddModelError(string.Empty, result.Error!);
Roles = await GetRolesAsync();
return Page();
}
TempData["Success"] = "User created successfully";
return RedirectToPage("./Index");
}
}
@* Pages/Users/Create.cshtml *@
@page
@model CreateModel
<h2>Create User</h2>
@if (TempData["Error"] is string error)
{
<div class="alert alert-danger">@error</div>
}
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="mb-3">
<label asp-for="Input.Name" class="form-label"></label>
<input asp-for="Input.Name" class="form-control" />
<span asp-validation-for="Input.Name" class="text-danger"></span>
</div>
<div class="mb-3">
<label asp-for="Input.Email" class="form-label"></label>
<input asp-for="Input.Email" class="form-control" type="email" />
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
<div class="mb-3">
<label asp-for="Input.RoleId" class="form-label"></label>
<select asp-for="Input.RoleId" asp-items="Model.Roles" class="form-select">
<option value="">Select a role</option>
</select>
<span asp-validation-for="Input.RoleId" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Create</button>
<a asp-page="./Index" class="btn btn-secondary">Cancel</a>
</form>
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
For page conventions, view components, and AJAX patterns: See references/REFERENCE.md.
aspnet-core | blazor | security
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer