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.netseite=2sortierung=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
- Immer validieren — Eingangsparameter vor der Verwendung prüfen
- Ausgabe kodieren —
HtmlEncodebeim Anzeigen von Werten im HTML verwenden - Stark typisierte Typen verwenden — statt reiner Strings, wenn möglich
- Standardwerte bereitstellen — für optionale Parameter
- Null-Prüfungen durchführen — vor Typkonvertierungen
- 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"]);