In meiner aktuellen ASP.NET core Schulung, kam die Teilnehmer Frage.”wie setzt man ein Feld eines gebundenen Propertys in OnGet oder OnPost”. Um das Problem per C# Code zu beschreiben
1: [BindProperty]
2: public string Feld { get; set; }
3: public void OnPost()
4: {
5: Feld = "irgendwas";
Das Eingabefeld im Webbrowser enthält trotzdem den ursprünglich vom Benutzer eingegebenen Wert. Das ModelBinding erzeugt einen ModelState, der auch nach dem Post immer den Inhalt der Textbox füllt, ohne auf Zeile 5 Rücksicht zu nehmen.
1: <form method="post">
2: <input asp-for="Feld" />
Wenn man die Seite mit Http Get neu lädt oder per Logik einen Redirect auf die Seite ausführt ist das HTML Formular logischerweise leer.
Der Grund liegt ganz grob darin erklärt, das der Modelstate den ursprünglich erfassten Wert halten muss, auch wenn er z.B. vom Datentyp rein gar nicht zum Model passt. Ein Property vom Typ Integer kann ja trotzdem per Formular mit String beschrieben werden. Im Form Post schickt ein Browser immer nicht typisierte Zeichenketten. Auch eine Fehlermeldung ist im ModelState hinterlegt um sie nach dem Post dem Benutzer, samt seiner Falscheingabe, anzeigen zu können. Das Verhalten ist also gewünscht. Mein Kursteilnehmer des ASP.NET core Training hat das aber anders gesehen.
Modelstate hat eine Methode Clear, die den State aller gebundenen Feldern löscht. Der Inhalt der Textbox (Input) bleibt trotzdem erhalten. Aber nun hat man die Chance den Wert in der PageModel Klasse (codebehind) zu verändern.
Falls man nicht das ganze Model verwerfen möchte, lässt sich auch per Remove ein einzelnes gebundenes Feld von Status befreien und neu beschreiben.
1: public void OnPost()
2: {
3: ModelState.Remove("Feld2");
4: // Feld = "irgendwas";
5: Feld2 = "neuer Wert";
6: ModelState.Clear();
7: }
Dabei spielt es keine Rolle ob man das Clear oder Remove vor dem setzen des Properties aufruft oder danach.