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

  1. Form view: Render inputs for name and message when not submitted.
  2. POST detection: Check $Context.Request.Method.
  3. Form parsing: Read $Context.Request.Form and extract fields.
  4. Validation: Require non-empty name and message.
  5. Model: Set $Model.Submitted, $Model.Name, $Model.Message, and $Model.Error.
  6. 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

References


Previous / Next

Previous: Quotes Next: AppInfo