Das Lesen von URL-Parametern (Query String) ist eine grundlegende Aufgabe in der Webentwicklung mit ASP.NET. Dieser Artikel behandelt alle modernen und klassischen Ansätze, von Web Forms über MVC bis hin zu ASP.NET Core und Minimal API.

Was ist ein Query String?

Ein Query String ist der Teil einer URL nach dem ?-Zeichen. Er enthält Schlüssel-Wert-Paare, die durch & getrennt sind:

https://beispiel.de/suchen?begriff=asp.net&seite=2&sortierung=datum

In diesem Beispiel:

  • begriff = asp.net
  • seite = 2
  • sortierung = datum

ASP.NET Web Forms (klassisch)

Request.QueryString

// URL: https://beispiel.de/seite.aspx?id=42&name=produkt

// Einzelnen Parameter abrufen
string id = Request.QueryString["id"];      // "42"
string name = Request.QueryString["name"];  // "produkt"

// Vor der Verwendung auf Existenz prüfen
if (!string.IsNullOrEmpty(Request.QueryString["id"]))
{
    int produktId = int.Parse(Request.QueryString["id"]);
    // ID verwenden...
}

Verwendung in Page_Load

protected void Page_Load(object sender, EventArgs e)
{
    string kategorie = Request.QueryString["kat"];
    
    if (!string.IsNullOrEmpty(kategorie))
    {
        lblKategorie.Text = Server.HtmlEncode(kategorie);
        LadeProdukte(kategorie);
    }
}

Sicherheit: Verwenden Sie immer Server.HtmlEncode(), wenn Sie Query-String-Werte auf der Seite anzeigen, um XSS-Angriffe (Cross-Site Scripting) zu verhindern.

ASP.NET MVC

Automatische Modellbindung

In MVC bindet das Framework URL-Parameter automatisch an die Parameter der Action-Methode:

// URL: /Produkte/Suchen?begriff=laptop&seite=1
public ActionResult Suchen(string begriff, int seite = 1)
{
    // 'begriff' = "laptop", 'seite' = 1
    var ergebnisse = _service.Suchen(begriff, seite);
    return View(ergebnisse);
}

Direkter Zugriff auf QueryString

public ActionResult Detail()
{
    string id = Request.QueryString["id"];
    // Oder in MVC, vorzugsweise:
    string id2 = Request["id"];
    
    return View();
}

ASP.NET Core

Das Attribut [FromQuery]

// URL: /api/produkte?kategorie=elektronik&preisMin=100&preisMax=500

[HttpGet]
public IActionResult ProdukteAuflisten(
    [FromQuery] string kategorie,
    [FromQuery] decimal? preisMin,
    [FromQuery] decimal? preisMax)
{
    // Parameter werden automatisch aus dem Query String gebunden
    var produkte = _repo.Filtern(kategorie, preisMin, preisMax);
    return Ok(produkte);
}

Bindung mit Abfrageobjekt

Für mehrere Parameter verwenden Sie eine Klasse:

public class ProduktFilter
{
    public string Kategorie { get; set; }
    public decimal? PreisMin { get; set; }
    public decimal? PreisMax { get; set; }
    public int Seite { get; set; } = 1;
    public int SeitenGroesse { get; set; } = 20;
}

[HttpGet]
public IActionResult Auflisten([FromQuery] ProduktFilter filter)
{
    // Alle URL-Parameter werden auf die Eigenschaften des Objekts abgebildet
    var ergebnisse = _repo.Filtern(filter);
    return Ok(ergebnisse);
}

Direkter Zugriff auf HttpContext

public IActionResult Index()
{
    // Direkter Zugriff ohne Modellbindung
    string wert = HttpContext.Request.Query["parameter"];
    
    // Auf Existenz prüfen
    if (HttpContext.Request.Query.ContainsKey("modus"))
    {
        string modus = HttpContext.Request.Query["modus"];
    }
    
    return View();
}

Minimal API (ASP.NET Core 6+)

var app = WebApplication.CreateBuilder(args).Build();

// URL-Parameter werden automatisch gebunden
app.MapGet("/suchen", (string begriff, int seite = 1) =>
{
    return Results.Ok(new { Begriff = begriff, Seite = seite });
});

// Mit explizitem [FromQuery]
app.MapGet("/filtern", ([FromQuery] string kategorie, [FromQuery] int? limit) =>
{
    return Results.Ok(new { Kategorie = kategorie, Limit = limit ?? 10 });
});

app.Run();

ReturnUrl-Muster (Weiterleitung nach Login)

Ein häufiger Anwendungsfall ist die Rückgabe-URL nach der Anmeldung:

// URL: /Konto/Login?ReturnUrl=%2Fdashboard%2Feinstellungen

[HttpPost]
public IActionResult Login(LoginViewModel modell, string returnUrl = null)
{
    if (ModelState.IsValid && BenutzerAuthentifizieren(modell))
    {
        // WICHTIG: URL muss lokal sein
        if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
        {
            return Redirect(returnUrl);
        }
        
        return RedirectToAction("Index", "Dashboard");
    }
    
    return View(modell);
}

Schutz vor offenen Weiterleitungen

Niemals so vorgehen:

// GEFÄHRLICH — anfällig für Open Redirect
return Redirect(Request.QueryString["ReturnUrl"]);

Immer vor der Weiterleitung validieren:

// SICHER — prüft, ob die URL lokal ist
string returnUrl = Request.Query["ReturnUrl"];
if (Url.IsLocalUrl(returnUrl))
{
    return Redirect(returnUrl);
}
return RedirectToAction("Index", "Home");

Ein Angreifer könnte ?ReturnUrl=https://boese-seite.de verwenden, um Benutzer auf eine Phishing-Seite umzuleiten.

Lesen mit JavaScript

Um URL-Parameter auf der Client-Seite zu lesen:

URLSearchParams (modern)

// URL: https://beispiel.de/seite?begriff=suche&lang=de

const params = new URLSearchParams(window.location.search);

// Einen Parameter abrufen
const begriff = params.get('begriff');  // "suche"
const lang = params.get('lang');        // "de"

// Prüfen, ob vorhanden
if (params.has('begriff')) {
    console.log('Suche nach:', params.get('begriff'));
}

// Alle Parameter durchlaufen
for (const [schluessel, wert] of params) {
    console.log(`${schluessel} = ${wert}`);
}

URLs mit Parametern erstellen

const url = new URL('https://beispiel.de/api/produkte');
url.searchParams.set('kategorie', 'elektronik');
url.searchParams.set('seite', '1');
console.log(url.toString());
// "https://beispiel.de/api/produkte?kategorie=elektronik&seite=1"

Best Practices

  1. Immer validieren — Eingangsparameter vor der Verwendung prüfen
  2. Ausgabe kodierenHtmlEncode beim Anzeigen von Werten im HTML verwenden
  3. Stark typisierte Typen verwenden — statt reiner Strings, wenn möglich
  4. Standardwerte bereitstellen — für optionale Parameter
  5. Null-Prüfungen durchführen — vor Typkonvertierungen
  6. Niemals vertrauen — URL-Werte ohne Validierung für sensible Operationen verwenden

Fehlerbehebung

Parameter ist immer null

  • Prüfen Sie, ob der Parametername exakt übereinstimmt (Groß-/Kleinschreibung beachten)
  • Stellen Sie sicher, dass das ? in der URL vorhanden ist
  • Bestätigen Sie, dass keine Kodierungsfehler bei Sonderzeichen vorliegen

Sonderzeichen werden nicht korrekt gelesen

Verwenden Sie Uri.UnescapeDataString() zum Dekodieren:

string wert = Uri.UnescapeDataString(Request.Query["text"]);

Verwandte Artikel