Dies ist mir zuvor noch nicht passiert, aber aus irgendeinem Grund werden sowohl die clientseitigen als auch die serverseitigen Validierungsereignisse nicht ausgelöst:
<asp:TextBox ID="TextBoxDTownCity" runat="server" CssClass="contactfield" />
<asp:CustomValidator ID="CustomValidator2" runat="server" EnableClientScript="true"
ErrorMessage="Delivery Town or City required"
ClientValidationFunction="TextBoxDTownCityClient"
ControlToValidate="TextBoxDTownCity"
OnServerValidate="TextBoxDTownCity_Validate" Display="Dynamic" >
</asp:CustomValidator>
Serverseitiges Validierungsereignis:
protected void TextBoxDTownCity_Validate(object source, ServerValidateEventArgs args)
{
args.IsValid = false;
}
Client-seitiges Validierungsereignis:
function TextBoxDCountyClient(sender, args) {
args.IsValid = false;
alert("test");
}
Ich dachte zumindest, die Server-Side-Validierung würde feuern, aber nein. Das ist mir noch nie passiert. Das hat mich wirklich verblüfft.
Ich habe mir die Ausgabe angesehen und ASP.NET erkennt die clientseitige Funktion:
ASP.NET-JavaScript-Ausgabe:
var ctl00_ctl00_content_content_CustomValidator2 = document.all ? document.all["ctl00_ctl00_content_content_CustomValidator2"] : document.getElementById("ctl00_ctl00_content_content_CustomValidator2");
ctl00_ctl00_content_content_CustomValidator2.controltovalidate = "ctl00_ctl00_content_content_TextBoxDTownCity";
ctl00_ctl00_content_content_CustomValidator2.errormessage = "Delivery Town or City required";
ctl00_ctl00_content_content_CustomValidator2.display = "Dynamic";
ctl00_ctl00_content_content_CustomValidator2.evaluationfunction = "CustomValidatorEvaluateIsValid";
ctl00_ctl00_content_content_CustomValidator2.clientvalidationfunction = "TextBoxDTownCityClient";
Gerenderter benutzerdefinierter Validator:
<span id="ctl00_ctl00_content_content_CustomValidator2" style="color:Red;display:none;">Delivery Town or City required</span>
Kann jemand ein wenig Licht auf die Frage stellen, warum die Validierung auf Client- und Server-Seite nicht ausgelöst wird.
Edit: Typo habe ich in der falschen Funktion eingefügt, Problem immer noch das selbe
Nur noch ein Update zum letzten Kommentar: Wobei die TextBox nicht leer sein darf. Ich habe das getestet und es stimmt nicht. Auf einer leeren Seite hat der CustomValidator meine clientseitige Validierungsfunktion ohne einen Wert ausgelöst:
<asp:TextBox ID="TextBox1" runat="server" />
<asp:CustomValidator ID="CustomValidator1" runat="server"
ErrorMessage="CustomValidator" ClientValidationFunction="TextBoxDAddress1Client"></asp:CustomValidator>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
Ihre CustomValidator
wird nur ausgelöst, wenn die TextBox
nicht leer ist.
Wenn Sie sicherstellen müssen, dass es nicht leer ist, benötigen Sie auch eine RequiredFieldValidator
.
EDIT:
Wenn Ihre Variable CustomValidator
das Attribut ControlToValidate
angibt (und Ihr ursprüngliches Beispiel dies tut), werden Ihre Validierungsfunktionen nur aufgerufen, wenn das Steuerelement nicht leer ist.
Wenn Sie nicht ControlToValidate
angeben, werden Ihre Validierungsfunktionen jedes Mal aufgerufen.
Dies eröffnet eine zweite mögliche Lösung des Problems. Anstatt eine separate RequiredFieldValidator
zu verwenden, können Sie das ControlToValidate
-Attribut aus der CustomValidator
weglassen und Ihre Validierungsfunktionen so einrichten, dass sie Folgendes ausführen:
Client Side Code (Javascript):
function TextBoxDCountyClient(sender, args) {
var v = document.getElementById('<%=TextBoxDTownCity.ClientID%>').value;
if (v == '') {
args.IsValid = false; // field is empty
}
else {
// do your other validation tests here...
}
}
Serverseitiger Code (C #):
protected void TextBoxDTownCity_Validate(
object source, ServerValidateEventArgs args)
{
string v = TextBoxDTownCity.Text;
if (v == string.Empty)
{
args.IsValid = false; // field is empty
}
else
{
// do your other validation tests here...
}
}
Benutze das:
<asp:CustomValidator runat="server" id="vld" ValidateEmptyText="true"/>
Um ein leeres Feld zu bestätigen.
Sie müssen nicht 2 Validatoren hinzufügen!
Die clientseitige Validierung wurde in meinem Webformular überhaupt nicht ausgeführt, und ich hatte keine Ahnung, warum. Es stellte sich heraus, dass das Problem darin bestand, dass der Name der Javascript-Funktion mit der Serversteuerungs-ID identisch war.
Also kannst du das nicht machen ...
<script>
function vld(sender, args) { args.IsValid = true; }
</script>
<asp:CustomValidator runat="server" id="vld" ClientValidationFunction="vld" />
Das funktioniert aber:
<script>
function validate_vld(sender, args) { args.IsValid = true; }
</script>
<asp:CustomValidator runat="server" id="vld" ClientValidationFunction="validate_vld" />
Ich vermute, es steht im Konflikt mit dem internen .NET Javascript?
Haben Sie überprüft, dass für das Steuerelement, das den Beitrag zurücksetzt, die Ursachenvalidation auf tru gesetzt ist und keine Validierungsgruppe zugewiesen ist?
Ich bin nicht sicher, was sonst dieses Verhalten verursachen könnte.
Stellen Sie außerdem sicher, dass Sie keine Validierungsgruppen verwenden, da die Validierung nicht ausgelöst wird, wenn die validationgroup -Eigenschaft festgelegt und nicht explizit über aufgerufen wurde
Page.Validate({Insert validation group name here});
Vielen Dank für diese Info zum ControlToValidate LukeH!
In meinem Code wollte ich nur sicherstellen, dass ein Textfeld A Text enthält, wenn das Textfeld B einen bestimmten Wert hat. Andernfalls kann A leer sein oder was auch immer. Das Problem mit ControlToValidate = "A" in meinem Markup wurde behoben.
Prost!
Die serverseitige Validierung wird nicht ausgelöst, wenn die clientseitige Validierung ungültig ist und das Postback nicht gesendet wird.
Haben Sie keine andere Bestätigung, die nicht besteht?
Die clientseitige Validierung wird nicht ausgeführt, da Sie ClientValidationFunction="TextBoxDTownCityClient"
angegeben haben. Diese Funktion sucht nach einer Funktion mit dem Namen TextBoxDTownCityClient
als Validierungsfunktion. Der Funktionsname sollte jedoch _____TextBoxDAddress1Client
sein.
(wie du geschrieben hast)