Validator et UpdatePanel - Bug des contrôles de validation avec Microsoft ASP.net Ajax
Si vous décidez d'utiliser des contrôles de validation dans un UpdatePanel il se peut que vous rencontriez des problèmes. En effet si vous rafraichissez un UpdatePanel qui contient un validator, le message d'erreur lié au validateur ne sera jamais affiché.
Prenons un exemple concret :
<asp:ScriptManager ID="sc1" runat="server" />
<asp:UpdatePanel ID="up1" runat="server">
<ContentTemplate>
<%=DateTime.Now.ToLongTimeString() %>
<asp:TextBox ID="tb1" runat="server" />
<asp:RequiredFieldValidator ID="rq1" runat="server" ControlToValidate="tb1" ErrorMessage="*" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btn1" />
<asp:AsyncPostBackTrigger ControlID="btn2" />
</Triggers>
</asp:UpdatePanel>
<asp:Button ID="btn1" runat="server" Text="Refresh UpdatePanel" CausesValidation="false" />
<asp:Button ID="btn2" runat="server" Text="Validate the textbox" />
Lorsque je click sur le premier bouton, mon UpdatePanel se rafraichit correctement, si je clique ensuite sur le second bouton et que la textbox est vide, rien ne ce passe ; la validation s'effectue correctement mais il n'y a aucun message d'erreur. La raison est que les contrôles de validation ont besoin d'un script client, or dans un UpdatePanel en cours de rafraichissement il faut utiliser la méthode ScriptManager.RegisterStartupScript & co pour pouvoir ajouter un script plutôt que ClientScript.RegisterStartupScript.
Dans les versions bétas et même RC de Microsoft Ajax Extensions, on avait des nouveaux validator, il suffisait d'utiliser le tagmapping, et tous les contrôles de validation fonctionnait correctement. Malheureusement dans la version finale, ces contrôles ont disparues ! D'après Matt Gibbs, il devrait bientôt avoir un patch pour ASP.net livré via Windows Update qui corrigera ce problème. En attendant vous pouvez utiliser les contrôles mis à disposition sur son blog : ASP.net Ajax Validators. Après avoir rajouté la dll dans le bin de votre application il vous faudra rajouter les quelques lignes suivantes dans votre web.config :
<tagMapping>
<add tagType="System.Web.UI.WebControls.CompareValidator"
mappedTagType="Sample.Web.UI.Compatibility.CompareValidator, Validators, Version=1.0.0.0"/>
<add tagType="System.Web.UI.WebControls.CustomValidator"
mappedTagType="Sample.Web.UI.Compatibility.CustomValidator, Validators, Version=1.0.0.0"/>
<add tagType="System.Web.UI.WebControls.RangeValidator"
mappedTagType="Sample.Web.UI.Compatibility.RangeValidator, Validators, Version=1.0.0.0"/>
<add tagType="System.Web.UI.WebControls.RegularExpressionValidator"
mappedTagType="Sample.Web.UI.Compatibility.RegularExpressionValidator, Validators, Version=1.0.0.0"/>
<add tagType="System.Web.UI.WebControls.RequiredFieldValidator"
mappedTagType="Sample.Web.UI.Compatibility.RequiredFieldValidator, Validators, Version=1.0.0.0"/>
<add tagType="System.Web.UI.WebControls.ValidationSummary"
mappedTagType="Sample.Web.UI.Compatibility.ValidationSummary, Validators, Version=1.0.0.0"/>
</tagMapping>
A partir de là, les contrôles de validation fonctionneront correctement dans un UpdatePanel.