Contact
Handle a simple GET/POST form by reading $Context.Request.Form in the sibling PowerShell script.
Full source
File: pwsh/tutorial/examples/Assets/Pages/Contact.cshtml
@page
@model Kestrun.Razor.PwshKestrunModel
@{
ViewData["Title"] = "Contact • Kestrun";
dynamic d = Model.Data ?? new { Submitted = false, Name = "", Message = "", Error = "" };
}
<div class="card">
<h1>Contact</h1>
<p class="muted">A simple form handled by PowerShell.</p>
</div>
@if (d.Submitted == true)
{
<div class="card">
<h2>Thanks, @d.Name!</h2>
<p>Message received:</p>
<pre>@d.Message</pre>
<a href="./Contact">Send another</a>
</div>
}
else
{
if (d.Error != null && d.Error != "")
{
<div class="card" style="border-color: rgba(255,70,70,0.35);">
<strong>Oops:</strong> @d.Error
</div>
}
<div class="card">
<form method="post">
<label>Name</label>
<input name="name" value="@(d.Name)" />
<div style="height:0.8rem;"></div>
<label>Message</label>
<textarea name="message" rows="5">@(d.Message)</textarea>
<div style="height:0.8rem;"></div>
<button type="submit">Send</button>
</form>
</div>
}
File: pwsh/tutorial/examples/Assets/Pages/Contact.cshtml.ps1
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '')]
param()
$req = $Context.Request
$name = ''
$msg = ''
$err = ''
$submitted = $false
if ($req.Method -eq 'POST') {
try {
# Ensure the form is read (ASP.NET Core will parse it)
$form = $req.Form
$name = [string]$form['name']
$msg = [string]$form['message']
if ([string]::IsNullOrWhiteSpace($name)) { $err = 'Name is required.' }
elseif ([string]::IsNullOrWhiteSpace($msg)) { $err = 'Message is required.' }
else { $submitted = $true }
} catch {
$err = "Failed to read form: $($_.Exception.Message)"
}
}
$Model = [pscustomobject]@{
Submitted = $submitted
Name = $name
Message = $msg
Error = $err
}
Step-by-step
- Form view: Render inputs for
nameandmessagewhen not submitted. - POST detection: Check
$Context.Request.Method. - Form parsing: Read
$Context.Request.Formand extract fields. - Validation: Require non-empty
nameandmessage. - Model: Set
$Model.Submitted,$Model.Name,$Model.Message, and$Model.Error. - Result view: Render a thank-you screen on success, or an error card on validation failures.
Try it
# GET the form
curl -i http://127.0.0.1:5000/Contact
# POST form fields
curl -i -X POST http://127.0.0.1:5000/Contact \
-H "Content-Type: application/x-www-form-urlencoded" \
--data "name=Alice&message=Hello%20from%20curl"
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| POST returns “Failed to read form” | Content-Type missing or body not form encoded | Send application/x-www-form-urlencoded and use --data |
| Validation errors show | Required fields empty | Provide both name and message fields |