2008-11-01 10 views
7

Ich habe eine asp.net-Seite mit einer Schaltfläche. Diese Schaltfläche generiert und fügt ein Benutzersteuerelement in die Seite ein, so dass viele Steuerelemente auf einer Seite vorhanden sein können. Ich muss validieren, dass ein bestimmtes dynamisch generiertes Steuerelement in dem generierten Steuerelement vorhanden ist.Überprüfen eines ASP.NET-Benutzersteuerelements von seiner übergeordneten Seite

So..Page hat 0 bis N Control1's. Jedes Control 1 kann 0 bis N Control2's haben. Wenn SaveButton auf der Seite angeklickt wird, muss ich sicherstellen, dass sich in jedem Control1 mindestens 1 Control2 befindet.

Ich bin zur Zeit zwischen zwei Möglichkeiten:

• Dynamisch einfügen CustomValidators für jede Steuerung, die erzeugt wird, von denen jede ein Control1 bestätigen würde.

• Führen Sie die Validierung manuell (mit jQuery) durch und rufen Sie eine Validierungsfunktion von SaveButton.OnClientClick auf.

Beide sind schlampig auf ihre eigene Art - deshalb teile ich das mit euch allen. Fehle ich die einfache Lösung?

Vielen Dank im Voraus .. (btw - alles bis SP1 .NET 3.5 einschließlich ist fair game)

+0

Checkout: [Wie UserControl validieren?] (Http://izlooite.blogspot.com/2010/07/how-to-validate-user-control.html) –

Antwort

8

Hmm Ich mag die Interface-Idee von Digiguru vorgeschlagen, aber ich würde die Schnittstelle auf dem Container Control1 anstelle der Untersteuerelemente verwenden, da es wie der logischere Ort für den Code zu leben scheint. Heres mein nehmen auf sie:

public interface IValidatableControl 
{ 
    bool IsValidControl();  
} 

dann implementieren diese auf Ihrem Control1

public class Control1 : IValidatableControl 
{ 
... Other methods 
    public bool IsValidControl() 
    { 

     foreach(object c in this.Controls) 
     { 
      if(c.GetType() == "Control2") 
       return true; 
     } 
     return false; 
    } 

} 

Es gibt wahrscheinlich bessere Möglichkeiten, dies zu schreiben, aber es sollte Ihnen genug von einer Idee geben, um loszulegen.

+0

Das ist eine großartige Idee, und es führt zu besser Design der Seite. Danke :) – JoeB

+1

Froh ich könnte helfen – digiguru

+2

Sie sollten die IValidator-Schnittstelle in ASP.Net verwenden, es bietet IsValid, Validate und ErrorMessage.Ihr Validator sollte es implementieren, und in Ihrem Init-Trigger müssen Sie Page.Validators.Add (this) aufrufen. – sisve

0

Eine Methode, die Sie könnten versuchen, ist die Schaffung und eine einfache XML-Struktur beibehalten, die Ihre individuelle Steuerungshierarchie darstellt. Wenn Sie ein benutzerdefiniertes Benutzersteuerelement erstellen oder löschen, können Sie diese Struktur jederzeit einfügen oder löschen. Überprüfen Sie beim Speichern, ob die in der XML-Struktur dargestellte Steuerhierarchie korrekt ist. Sie könnten das XML im Session-Objekt speichern, um es über Postbacks hinweg zu erhalten.

2

Wenn Sie im laufenden Betrieb Benutzersteuerelemente hinzufügen, können Sie jedes Steuerelement die gleiche Schnittstelle mit einer Validate-Funktion implementieren. Auf diese Weise können Sie die Steuerelemente in jedem übergeordneten Steuerelement auf der Seite in einen Platzhalter laden. Wenn die Seite übergeben wurde, durchlaufen Sie einfach die Steuerelemente im Platzhalter, umwandeln Sie sie in die Schnittstellenklasse, und rufen Sie dann die Validierungsfunktion auf. Ich verwende keine benutzerdefinierten Validatoren, aber Sie können mit dem von der Validierungsfunktion zurückgegebenen Objekt eine Liste von Validierungsfehlern erstellen. Sie können diese Sammlung von Validierungsfehlern nach Belieben rendern.

1

Ich denke, Sie könnten es tun, indem Sie eine öffentliche Eigenschaft in Control1 zuweisen, die auf die Existenz der ID von Control2 verweist, und dann die Klasse von Control1 mit ValidationProperty dekorieren. Ich denke, etwas in dieser Richtung:

[ValidationProperty("Control2Ref")] 
public partial class Control1 : UserControl 
{ 
    public string Control2Ref 
    { 
     get { return FindControl("Control2"); } 
    } 
    // rest of control 1 class 
} 

Und dann sollten Sie eine RequiredFieldValidator bei einer Instanz von Control1 zeigen können.

+0

Indika Noten (schlecht) ein möglicher Fehler in diesem ... –

Verwandte Themen