Domanda

So che nella prossima versione di ASP.NET saremo finalmente in grado di impostare le clientids sui controlli System.web senza il quadro farlo per noi in modo quasi-intelligente per esempio:

id="ctl00__loginStatus__profileButton"

Qualcuno conosce un buon metodo, nel frattempo, per forzare l'id sopra a qualcosa di simile

id="profileButton"

La ragione principale di ciò è la manipolazione dei clientids in jQuery quando si aggiungono dinamicamente controlli a una pagina. Il problema che vedo sta cambiando gli ID rompere la ViewState?

È stato utile?

Soluzione

Quello che io tendo a fare è generare dinamicamente javascript metodi che gestiscono questo. È possibile farlo nel markup o codice dietro quindi, ad esempio:

<script language="javascript" type="text/javascript">
function doXYZ()
{
   $("#" + getListBoxId()).css(...)
}

function getListBoxId()
{
 return "<%=this.myListBox.ClientId>";
}

</script>

È anche possibile costruire le funzioni nel codice dietro e registrarli.

Modifica

Un paio di mesi fa avevo bisogno di risolvere l'id di alcuni controlli server, sono riuscito a incidere e ho descritto il mio metodo qui qui .

Fondamentalmente è necessario inserire i controlli all'interno di un contenitore di denominazione come un controllo utente, e quindi ignorare un paio di proprietà che impedisce i controlli figlio di ottenere la loro uniqueid.

Altri suggerimenti

Si deve utilizzare l'attributo ClientIDMode:

<asp:xxxx ID="fileselect" runat="server" ClientIDMode="Static"/>  

La prestazione non è grande, ma è possibile utilizzare questa sintassi selettore per abbinare ClientIDs disordinato:

$("[id$='_profileButton']")

che corrisponde a qualsiasi elemento fine in _profileButton . Aggiungendo la sottolineatura assicura che si sta corrispondenza dell'elemento desiderato e non un altro elemento che termina nella stringa "profileButton" (ad esempio "myprofileButton").

Dal momento che ha per scorrere su tutta la DOM, le prestazioni possono essere poveri se lo si utilizza in un ciclo o più volte in una sola volta. Se non abusare di esso, l'impatto sulle prestazioni non è molto significativo.

Un altro modo sarebbe quello di avvolgere il vostro controllo con un div o luce con un id statica, quindi accedere al controllo attraverso quella.

per es.

<span id="mySpan">
<asp:TextBox id="txtTest" runat="server" />
</span>

È quindi possibile indirizzare tag di ingresso all'interno MySpan. (Anche se sono d'accordo che sarebbe bello essere in grado di specificare un bel nome, a condizione che si potesse gestire i conflitti di nomi ...)

ho spesso eseguito in a questo "problema", mentre in via di sviluppo in ASP.NET WebForms. Nella maggior parte dei casi tendo a usare la classe CSS dell'elemento.

jQuery(".My .Container12")

Prima di iniziare a manipolare l'id: s, forse è un modo per gestire la cosa aswell? Si tratta di una soluzione semplice.

C'è un'altra soluzione non menzionato, che è quello di sottoclasse i controlli ASP.NET e forzare gli ID:

public class MyCheckBox : CheckBox
{
    public string ForcedId { get;set; }

    public override string ID
    {
        get
        {
            if (!string.IsNullOrEmpty(ForcedId))
                return ForcedId;
            else
                return base.ID;
        }
        set
        {
            base.ID = value;
        }
    }

    public override string ClientID
    {
        get
        {
            return ID;
        }
    }
}

Quindi utilizzare questo in cui si conosce l'ID non sarà mai scontrarsi :

<mytag:MyCheckBox ForcedId="_myCheckbox" runat="server" />

Se si utilizza le liste è necessario scrivere un ListControlAdapter e adattatori anche per ogni tipo di lista che si sta utilizzando (discesa, checkbox, radiobutton, casella di riepilogo). In alternativa incrociare le gambe e attendere NET 4.0.

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