1. Ereignis
Dies ist ein Problem, das ich lange Zeit ignoriert oder nicht entdeckt habe. Das Problem ist wie folgt:
Wenn auf einer Seite ein Validierungssteuerelement vorhanden ist, das Button-Steuerelement das OnClientClick-Ereignis auslöst und dieses Ereignis „true“ und „false“ zurückgibt, wird das Validierungssteuerelement ungültig und funktioniert nicht mehr. Die konkrete Beschreibung lautet wie folgt:
Die .Net-Seite sieht wie folgt aus:
Kopieren Sie den Codecode wie folgt:
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div>
<asp:TextBox ID="TextBoxTest" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBoxTest"
ErrorMessage="Kann nicht leer sein" Display="Keine"></asp:RequiredFieldValidator><ajaxToolkit:ValidatorCalloutExtender
ID="ValidatorCalloutExtender1" TargetControlID="RequiredFieldValidator1" runat="server">
</ajaxToolkit:ValidatorCalloutExtender>
<asp:Button ID="ButtonText" runat="server" Text="Test" OnClientClick="return activate('Sind Sie sicher, dass Sie senden möchten?');" />
</div>
</form>
Fügen Sie wie oben das Validierungssteuerelement RequireFieldValidator zur Seite hinzu, damit der Wert von TextBoxTest nicht leer sein darf. Wenn ButtonText die Seite übermittelt, wird der Benutzer aufgefordert, zu bestätigen, ob sie übermittelt werden muss. Es ist eine sehr einfache Seite und scheint keine Probleme zu haben. Wenn der Wert von TextBoxTest jedoch leer ist, funktioniert die Validierungssteuerung nicht und die Seite wird erfolgreich übermittelt. Was ist der Grund dafür?
2. Reagieren Sie auf Ereignisse
Was ist los? Nachdem ich das OnClientClick-Ereignis von ButtonTest entfernt hatte, funktionierte zunächst die Überprüfungskontrolle. Warum ist das so? Ich habe den Quellcode der Seite überprüft und festgestellt, dass das ButtonTest-Steuerelement den folgenden Quellcode generiert:
<input type="submit" name="ButtonText" value="Test" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(ButtonText, , true, , , false, false))" id="ButtonText" />
Wie aus dieser Quellcodezeile ersichtlich ist, generiert die Validierungssteuerung auf der Clientseite einen Javascript-Code, um zu überprüfen, ob der Wert in der TextBox leer ist. Nachdem ich OnClientClick von ButtonTest hinzugefügt habe, habe ich den Quellcode erneut überprüft. Der vom ButtonTest-Steuerelement generierte Quellcode lautet wie folgt:
<input type="submit" name="ButtonText" value="Test" onclick="return activate('Sind Sie sicher, dass Sie senden möchten?');WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(ButtonText, , true, , , false, false )) " id="ButtonText" />
Anhand dieser Codezeile können Sie deutlich erkennen, wo das Problem liegt. Auf der Clientseite wird zuerst das benutzerdefinierte Javascript ausgeführt, und dann wird das von der Validierungskontrolle generierte Javascript ausgeführt irgendeine Bedeutung.
3. Reaktionskontrollen
Sobald Sie wissen, wo das Problem liegt, ist es einfacher, es zu lösen: Überprüfen Sie vor dem Ausführen des benutzerdefinierten Javascripts (Rückgabebestätigung („Sind Sie sicher, dass Sie es senden möchten?“), ob die Steuerelemente auf der Seite den Anforderungen entsprechen Regeln, daher habe ich das OnClientClick-Ereignis von ButtonTest wie folgt geändert:
Kopieren Sie den Codecode wie folgt:
<asp:Button ID="ButtonText" runat="server" Text="Test" OnClientClick="if(CheckClientValidate()) return Confirm('Sind Sie sicher, dass Sie die Seite senden möchten?');" />
Der Code der CheckClientValidate()-Methode lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
<script language="javascript" type="text/javascript">
Funktion CheckClientValidate(){
Page_ClientValidate();
if (Page_IsValid){
return true;
}anders{
return false;
}
}
</script>
Ausführen, testen. Validierungskontrollen funktionieren. Problem gelöst.
4. Nachwort
Dies ist das Problem und die Lösung, die ich zu ignorieren wusste. Als ich dieses Problem entdeckte, brach mir der Schweiß aus. Glücklicherweise habe ich eine strenge serverseitige Überprüfung durchgeführt, sonst wäre es miserabel. Hier können wir auch erkennen, wie notwendig es ist, eine strenge serverseitige Überprüfung festzulegen :-). Es verhindert nicht nur, dass „Hacker“ die Client-Verifizierung umgehen, sondern verhindert auch Datenungenauigkeiten, die durch Fehler verursacht werden, die man selbst nicht bemerkt.
Notiz:
Page_ClientValidate(), diese Funktion wird in ASPX-Seiten verwendet, die Microsoft-Validierungssteuerelemente enthalten, um „True“ oder „False“ zurückzugeben, je nachdem, ob der Benutzereingabevorgang zulässig ist.
Kann direkt beurteilt werden.
Kopieren Sie den Codecode wie folgt:
if(Page_ClientValidate())
{
return true;
}
anders
{
return false;
}