Il modo migliore per impostare globalmente la proprietà ValidationGroup di ogni controllo in un asp.net?

StackOverflow https://stackoverflow.com/questions/1424577

  •  07-07-2019
  •  | 
  •  

Domanda

Ho un controllo utente con elementi di modulo che vengono riutilizzati considerevolmente in un'applicazione Web di grandi dimensioni e fino a questo punto il riassunto di convalida in caso di invio di un modulo non valido viene gestito da .aspx che utilizza il controllo utente.

Ora devo impostare la proprietà ValidationGroup in fase di esecuzione per ciascuno dei miei controlli degli elementi del modulo (caselle di testo, elenchi, validatori, ecc.). Piuttosto che farlo manualmente impostando ciascun controllo, sono interessato a scorrere tutti i controlli nel Controllo utente, rilevare se quel controllo ha una proprietà ValidationGroup e impostarne il valore in questo modo.

Qualcosa del genere:

For Each ctrl As System.Web.UI.Control In Me.Controls
   ' so now what is the proper way to detect if this control has the ValidationGroup property
Next

L'esempio di codice in vb.net o c # funziona per me. Mille grazie!

È stato utile?

Soluzione

UserControl dovrebbe esporre una proprietà che imposta correttamente la proprietà ValidationGroup al suo interno.

Controllo markup in .ASPX:

<ctl:yourcontrol id="whatever" runat="server" YourValidationGroupProp="HappyValidationName" />

Control Code-behind .ASCX:

 protected override void OnPreRender(EventArgs e)
 {
     someControl.ValidationGroup = YourValidationGroupProp;
     someControl1.ValidationGroup = YourValidationGroupProp;
     someControl2.ValidationGroup = YourValidationGroupProp;
     //......etc
 }    

 public string YourValidationGroupProp{ get; set; }

Altri suggerimenti

Crea un controllo personalizzato ereditando, ad esempio, letterale. Questo controllo sarà di aiuto.

Lo inserirai in una pagina, fagli fare tutto il lavoro sporco per te. per esempio. codice di output [che richiederebbe molto tempo per scrivere] basato su una logica e una volta che hai finito con esso.

Ottieni quel codice automatico (che sarebbe pesante se fosse effettivamente fatto ogni volta da un altro controllo), rimuovi il controllo helper e posiziona il nuovo codice nel modo che preferisci.

In questo modo eviti tutti gli errori facendo in modo che il computer capisca il codice che desideri come desideri e ottieni tutta la velocità codificata che risentirebbe risolvendo il problema con il metodo generico.

Ero solo alla ricerca della stessa cosa e improvvisamente mi ha colpito. Uso questo metodo per altre cose [scansiona tutti i controlli e amp; output del codice di inizializzazione] ma immagino che potresti usare questo metodo anche per farlo facilmente!

L'ho appena scritto e lo condividerò con te

public class ValidationCodeProducerHelper : Literal
{
    // you can set this in the aspx/ascx as a control property
    public string MyValidationGroup { get; set; }

    // get last minute controls
    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        // start scanning from page subcontrols
        ControlCollection _collection = Page.Controls;
        Text = GetCode(_collection).Replace("\r\n", "<br/>");
    }

    private string GetCode(Control _control)
    {
        // building helper
        StringBuilder _output = new StringBuilder();

        // the logic of scanning
        if (_control.GetType().GetProperty("ValidationGroup") != null && !string.IsNullOrEmpty(_control.ID))
        {
            // the desired code
            _output.AppendFormat("{0}.{1} = {2};", _control.ID, "ValidationGroup", MyValidationGroup);
            _output.AppendLine();
        }

        // recursive search within children
        _output.Append(GetCode(_control.Controls));

        // outputting
        return _output.ToString();
    }

    private string GetCode(ControlCollection _collection)
    {
        // building helper
        StringBuilder _output = new StringBuilder();
        foreach (Control _control in _collection)
        {
            // get code for each child
            _output.Append(GetCode(_control));
        }
        // outputting
        return _output.ToString();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top