asp.net 4.0 webforms - come mantenere ContentPlaceHolder1_ fuori cliente id in modo semplice?

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

  •  26-09-2019
  •  | 
  •  

Domanda

Sto tentando di introdurre le pagine master a un sito webforms esistente che è evitato di utilizzarli a causa del cliente id storpiatura in passato (e mi non voler affrontare la mutilazione e facendo <% foo.ClientID%> ovunque :)

Obiettivo: uso valori id 'statici' (ciò che è in attributo id del controllo server) tranne per associazione a dati / controlli a ripetizione, che si rompono per questi casi e suffissi quindi bisogno o qualsiasi altra cosa per differenziare (in pratica, prevedibile)

Ora che il sito migrato ad ASP.NET 4.0, ho tentato di usare ClientIDMode di Static (nel web.config), ma che ha fatto traboccare troppi luoghi che fanno ripetere controlli (caselle di controllo all'interno di GridView, per esempio) in quanto tutto ha portato con lo stesso ID.

Quindi, ho poi provato (di nuovo, proprio nel web.config) prevedibile in modo che i controlli ripetuti non sarebbero in conflitto di id, e funziona bene tranne che il maestro contenuto della pagina segnaposto ( che è in effetti un contenitore di denominazione) è ancora riflettendo in risultante client di identificazione (ad esempio, ContentPlaceHolder1_someCheckbox).

Certamente ho potuto lasciare l'impostazione web.config come statica e quindi passare attraverso tutti i databound / controlli ripetuti li passare al prevedibile, ma spero ci sia un / modo più semplice più semplice per ottenere questo effetto, senza dover attributi ClientIDMode scatter in quelli N numero di posti (o estendere tutti quei controlli databound con la mia UserControl che solo set ClientIDMode, o qualsiasi altra cosa).

ho anche pensato di lasciare insieme web.config per statica e facendo un gestore master o basepage (PreInit? Non so se questo avrebbe funzionato o no) che sarebbe andato a piedi con controlli OfType<INamingContainer> () (potrebbe essere una scelta migliore su il tipo, ma che sembra una buona scelta a partire guardando ripetitore e gridView) e quindi impostare coloro ai prevedibile quindi mi piacerebbe ottenere statica per tutte le mie cose 'normali' al di fuori di ripetere i controlli, ma non avere a che fare con le cose all'interno statiche come gridView / ripetitore / etc.

Non vedo alcun modo per marcare il contenuto segnaposto in modo tale che 'opta out' di essere inclusa nel bambino id - impostando l'ID del segnaposto per svuotare / vuota non funziona in quanto è un attributo richiesto :)

A quel punto ho pensato che ci fosse una migliore / modo più semplice che mi mancava e ha deciso di chiedere il SO:)

Edit: ho pensato di cambiare tutti i miei 'Richiamare da id' chiamate jQuery da $ ( '# foo') per fetch_by_id ( 'foo') e poi avere quella funzione restituisce il 'quella giusta' controllando $ ( '# pippo '). length e poi $ (' # ContentPlaceHolder1_foo '). length (e forse altri modelli) o anche solo averlo return $ (' # foo, # ContentPlaceHolder1_foo ') (di nuovo, potenzialmente altri modelli), ma che cambiano tutti i luoghi Prendo elementi di id sembrava abbastanza brutto anche, e vorrei evitare che livello di astrazione, se possibile farlo facilmente:)

Edit2: WRT utilizzando il selettore jQuery di id $ = 'foo':

la mia preoccupazione di fare una cosa del genere (anche se può essere più immaginato che reale) si ha quando una delle id in una pagina si conclude con un'altra. Per esempio, se una pagina ha elementi con id di 'foo' e 'barfoo' quindi id = $ 'pippo' includerà accidentalmente il 'barfoo' pure. Certamente ci sono un sacco di metodi per prevenire che (come suffisso con il tipo di elemento, in modo fooCheckbox e barfooButton o qualsiasi altra cosa), ma io non volevo avere a eseguire la scansione del sorgente esistente e / o di applicare una nuova regola per la denominazione.

Dal momento che non tutti i controlli sono controlli server, non posso $ = '_ foo' sia dal momento che un normale div id = "foo" non sarà trovata (e preferisco evitare runat = "server" solo a storpiare il nome:)

Un'altra cosa che ho considerato stava facendo un nome di classe CSS univoco per ogni elemento e selezionando il che invece (in quanto classe, ovviamente, non viene storpiato), ma è molto hacky di farlo e certamente intorbida le cose quando si fa il CSS 'reale' lavoro:)

È stato utile?

Soluzione

Onestamente non so se c'è un modo semplice di farlo, ma considerando che si sta utilizzando jQuery ciò che ho fatto in passato è, ho usato il estremità attributo con il metodo selettore .

Da Net aggiunge il proprio ID "statica" alla fine di esso è generato id, è possibile ottenere che con la $("input[id$='yourstaticid']") selettore di jQuery.

So che questa non è la soluzione che state cercando, ma sarebbe rendere il vostro 'fetch_by_id' più semplice.

La speranza che aiuta o vi dà un'idea almeno.

Altri suggerimenti

ClientIDMode = UI.ClientIDMode.Static

È necessario impostare questo nel "costruttore".

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