Domanda

Ho una pagina asp.net con un pulsante. Questo pulsante genera e inserisce un controllo utente nella pagina, quindi potrebbero esistere molti controlli su una pagina. Devo confermare che esiste un certo controllo generato dinamicamente all'interno del controllo generato.

Quindi ... La pagina ha da 0 a N Control1 ". Ogni Control 1 può avere da 0 a N Control2. Quando si fa clic su SaveButton nella pagina, devo assicurarmi che ci siano almeno 1 Control2 all'interno di ogni Control1.

Sono attualmente tra due opzioni:

• Inserisci dinamicamente CustomValidator per ogni controllo che viene generato, ciascuno dei quali convaliderebbe un Control1.

• Esegui la convalida manualmente (con jQuery), chiamando una funzione di convalida da SaveButton.OnClientClick.

Entrambi sono sciatti a modo loro, motivo per cui lo condivido con tutti voi. Mi manca la soluzione semplice?

Grazie in anticipo .. (tra l'altro - qualsiasi cosa fino a .NET 3.5 SP1 incluso è un gioco equo)

È stato utile?

Soluzione

Hmm mi piace l'idea di interfaccia suggerita da digiguru ma vorrei usare l'interfaccia sul contenitore Control1 invece dei sotto-controlli in quanto sembra il posto più logico in cui il codice può vivere. Ecco la mia opinione su di esso:

public interface IValidatableControl
{
    bool IsValidControl();    
}

quindi implementalo sul tuo Control1

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

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

}

Probabilmente ci sono modi migliori per scrivere questo, ma dovrebbe darti un'idea abbastanza per iniziare.

Altri suggerimenti

Se si aggiungono controlli utente al volo, è possibile fare in modo che ciascun controllo implementi la stessa interfaccia con una funzione Convalida. In questo modo è possibile caricare i controlli in un segnaposto in ciascun controllo principale nella pagina. Quando la pagina viene inviata, basta scorrere i controlli nel segnaposto, eseguirne il cast nella classe di interfaccia e quindi chiamare la funzione di convalida. Non utilizzo validatori personalizzati, ma è possibile creare un elenco di errori di convalida utilizzando l'oggetto restituito dalla funzione di convalida, è possibile eseguire il rendering di questa raccolta di errori di convalida nel modo desiderato.

Penso che potresti farlo assegnando una proprietà pubblica in Control1 che fa riferimento all'esistenza dell'ID Control2 e quindi decora la classe Control1 con ValidationProperty. Sto pensando a qualcosa del genere:

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

E quindi dovresti essere in grado di puntare un RequiredFieldValidator su un'istanza di Control1.

Un metodo che potresti provare è la creazione e il mantenimento di una semplice struttura XML che rappresenta la tua gerarchia di controllo personalizzata. Inserisci o elimina da questa struttura ogni volta che crei o distruggi un controllo utente personalizzato. Al momento del salvataggio, confermare che la gerarchia dei controlli rappresentata nella struttura xml sia corretta. È possibile salvare il file XML nell'oggetto Session per mantenerlo su tutti i postback.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top