In realtà, ho già almeno 3 diverse soluzioni per il problema, semplicemente non mi piacciono per nessuna ragione.
In ASP.NET MVC / Razor, non ci sono più controlli, nel senso in cui erano in ASP.NET. Un controllo ASCX usato per essere vista + controller si intrecciava, quindi ho capito. Invece abbiamo helper html che emettono stringhe, frammenti html. Diciamo che voglio creare un metodo di supporto in una libreria che crea un selettore di date dell'interfaccia utente jQuery.
Prima soluzione. Scrivo solo un metodo che prima crea una casella di testo (in realtà posso chiamare TextBoxFor
perché fa la stessa cosa per me), quindi crea un piccolo frammento di codice JavaScript che chiama $('#textboxid').datepicker()
. Quindi posso chiamarlo nelle mie visualizzazioni Razor e funziona. Non mi piace il fatto che le cose relative alla vista siano fatte in codice, e non in Razor, ma tutti i modelli di editor predefiniti sono così, purtroppo. Non mi piace il fatto che ci saranno molti piccoli frammenti di script dopo ogni casella di testo nell'output HTML. E il mio frammento di codice può diventare complesso, se quell'inizializzatore JS avesse molti parametri, sarebbe brutto, ci sarebbero problemi di escape delle stringhe, ecc.
Microsoft sta spingendo un'architettura JavaScript non invadente. Potrei semplicemente mettere una classe di marcatori CSS sulla mia casella di testo, aggiungere alcuni attributi dei dati, se necessario, ed emettere solo un JavaScript che trasforma tutte le mie caselle di testo fino alla data di selezione, in base alla classe del marcatore CSS. Questa ultima parte è il problema principale, ho bisogno di un codice JS imperativo per farlo. L'AJAX discreto e la convalida funzionano bene perché non ne hanno affatto bisogno, rispondono solo agli eventi di interazione dell'utente. Questo non è il caso, ho bisogno di trasformare le mie caselle di testo fino a raccoglitori di data ogni volta che appaiono. E possono apparire dinamicamente in una griglia modificabile, o dopo una chiamata AJAX, ogni volta.
Terza soluzione, la vista dovrebbe essere fatta in Razor, quindi facciamolo in Razor, come modello di editor. Il problema è che stiamo parlando di una biblioteca di classi qui. In passato, ho visto i brutti hack per incorporare i file .cshtml come risorse incorporate o compilarle nel codice C # durante la compilazione. L'ultima volta che ho controllato, sembravano brutti hack e non erano supportati.
C'è un'altra soluzione? In caso contrario, quale di questi è il più bello, quello più conforme alle convenzioni di codifica state-of-the-art, o l'idea di Microsoft, ecc.?