2010-07-04 8 views
0

J'ai un UserControl qui contient un TextBox et un CustomValidator.Validation personnalisée dynamique ServerValidate à l'aide de Reflection

Je voudrais mettre l'CustomValidator.ServerValidate à une méthode dans la page qui contient le UserControl

J'ai trouvé ce code qui me permettra de définir dynamiquement la coutume validateurs fonction de validation:

cusvCustom.ServerValidate += new System.Web.UI.WebControls.ServerValidateEventHandler(MethodName); 

Le problème est qu'une valeur de chaîne ne fonctionnera pas là. Il doit être une référence à la méthode. Est-il possible d'utiliser la réflexion (ou une autre méthode) pour obtenir une référence valide à la méthode des contrôles parent en utilisant uniquement le nom de la chaîne? La raison pour laquelle je veux utiliser la valeur de chaîne du nom de la méthode est que je puisse placer le contrôle sur la page thusly:

<uc1:TextBoxField ID="tbUserName" runat="server" CustomValidationMethod="ValidateUserName" /> 

Je l'ai fait quelques recherches et j'ai trouvé Type.GetMethod et MethodInfo, mais je ne peux pas eux de travailler. Principalement parce que je ne connais pas le type de contrôle parent et ne peux pas comprendre comment l'obtenir.

EDIT: Mon code pour mat-dot-net

WebUserControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl.ascx.cs" Inherits="WebApplication1.WebUserControl" %> 
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="Custom Validation Failed" OnServerValidate="CustomValidator1_ServerValidate" /> 
<asp:TextBox ID="TextBox1" runat="server" /> 
<asp:Button ID="Button1" runat="server" Text="Submit" CausesValidation="true" /> 

WebUsecControl.ascx.cs

using System; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace WebApplication1 
{ 
    public partial class WebUserControl : System.Web.UI.UserControl 
    { 
     public ServerValidateEventHandler Validating; 

     protected void CustomValidator1_ServerValidate(object sender, ServerValidateEventArgs e) 
     { 
      if (Validating != null) 
       Validating(sender, e); 
     } 
    } 
} 

TestPage.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestPage.aspx.cs" Inherits="WebApplication1.TestPage" %> 
<%@ Register Src="~/WebUserControl.ascx" TagName="WebUserControl" TagPrefix="uc1" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
    <uc1:WebUserControl ID="WebUserControl1" runat="server" OnValidating="WebUserControl1_Validating" /> 

    </div> 
    </form> 
</body> 
</html> 

TestPage.aspx.cs 0 Comme vous pouvez le voir, c'est presque une copie exacte de votre code. Pour une raison quelconque, cela ne fonctionne pas pour moi comme je l'ai ici. Lorsque je clique sur le bouton, la page se recharge et est la même. Quand je ne commente pas une ligne et clique sur le bouton, je vois le message d'erreur.

Répondre

2

Je pense que c'est ce que vous voulez faire:

WebUserControl.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %> 
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="Custom Validation Failed" 
ControlToValidate="TextBox1" OnServerValidate="CustomValidator1_ServerValidate" /> 
<asp:TextBox ID="TextBox1" runat="server" /> 
<asp:Button ID="Button1" runat="server" Text="Submit" CausesValidation="true" /> 

Et dans votre code derrière:

public partial class WebUserControl : System.Web.UI.UserControl 
{ 
    public event ServerValidateEventHandler Validating; 

    protected void CustomValidator1_ServerValidate(object sender, ServerValidateEventArgs e) 
    { 
     if (Validating != null) 
      Validating(sender, e); 
    } 
} 

Cela vous permettra d'utiliser le contrôle sur une page comme vous le souhaitez:

<uc1:WebUserControl ID="WebUserControl1" runat="server" OnValidating="WebUserControl1_Validating" /> 

Puis dans votre code .aspx.cs derrière:

protected void WebUserControl1_Validating(Object sender, ServerValidateEventArgs e) 
{ 
    //do validation here 
} 
+0

C'est en fait exactement ce que je suis à la recherche et beaucoup plus simple que ce que je pensais que ce serait traitée. Le seul problème que j'ai en ce moment c'est que ça ne marche pas. CustomValidator1_ServerValidate est appelé mais la validation est toujours nulle. Avez-vous une idée pourquoi? Est-ce que OnValidating vous apparaît également dans IntelliSense? Ce n'est pas pour moi. – William

+0

La validation sera nulle si vous n'avez pas connecté un gestionnaire d'événement dans votre code de page. –

+0

Hmm. Toujours être bizarre pour moi. J'ai copié votre code exactement et mis "e.IsValid = false;" comme ma validation, il devrait toujours échouer.Je ne sais pas pourquoi mais cela ne fonctionne toujours pas à moins que j'ajoute "WebUserControl1.Validating + = WebUserControl1_Validating;" à la page aspx pageLoad méthode. Je suppose que c'est le travail fait mais ce serait bien de ne pas avoir à ajouter à la méthode de chargement de la page si possible. – William

Questions connexes