Sense user-agent per determinare l'HTML - Tenere separati HTML e logica?

0

Sono d'accordo sul fatto che dovresti cercare di mantenere l'HTML fuori dalla tua logica e mantenere la logica fuori dal tuo HTML. E.G .: Non scrivi HTML in (C # stringhe o Javascript Services) e passali nella View o nel DOM. Allo stesso modo, non si scrive più ASP classico (e personalmente limito / annullo il Rasoio). HTML è per HTML, i servizi sono per la logica. La mia domanda si basa su questa best practice. Naturalmente ci sono piccole rarità. Counter E.G .: I fan del rasoio usano la classe HTML Extensions. Ma Razor è la sua bestia.

Tenendo presente questa "best practice", è male percepire l'agente utente nelle intestazioni e inviare chiavi o HTML alla vista per quel supporto specifico? E.G .: Sento un agente utente di iPad, quindi invio una specifica dichiarazione <style...> di iPad o un flag sul ViewBag in modo che la mia vista decida quali dichiarazioni di <style...> utilizzare.

Chiedo perché non sembra sufficiente utilizzare le dichiarazioni dei supporti CSS basate sulla larghezza del supporto. Un desktop può (ed è spesso) essere impostato sullo stesso 768 di un iPad.

Ma su un desktop, voglio che i miei stili siano unidirezionali; e su un iPad, voglio che siano un altro.

Quindi rompe le best practice per percepire il lato server-agente-utente per fare scelte progettuali sul lato client?

Nota: non si tratta di "Come si modifica il CSS per iPad". Per quanto mi riguarda, le tue uniche opzioni sono css @media declaration, o sensing sul lato server. Voglio solo conoscere l'impatto sulle best practice.

    
posta Suamere 11.05.2015 - 22:25
fonte

1 risposta

1

Hai assolutamente ragione nel pensare, sì, devi assolutamente tenerli separati.

Tuttavia, non è necessario essere così difficile come si potrebbe pensare, al fine di ottenere il corretto funzionamento del layout su più dispositivi.

Realisticamente, hai 3 approcci che sono considerati pratica moderna in questa arena.

1) Creare un sito satellite per ciascuna piattaforma che si desidera supportare, quindi in un singolo controller dell'indice semplice, annusare l'agente utente e reindirizzare al sito satellite appropriato.

2) Utilizzare le query multimediali. Il supporto di Media Query è ora (ed è stato per un po 'di tempo) abbastanza buono e sufficientemente supportato da poter essere utilizzato nei siti di produzione completi.

3) Utilizza un toolkit UI come KnockoutJS o Angular e modifica i nomi delle classi e gli attributi sui tuoi layout in tempo reale, rispondendo alle modifiche degli user agent.

Più in dettaglio

Se decidi di andare con opzione 1 , la prima cosa di cui devi essere a conoscenza è il lavoro extra.

Essenzialmente, manterrai due siti.

Il tuo back-end tuttavia dovrebbe probabilmente rimanere lo stesso. Se utilizzi un design classico nTier con una radice di composizione SOLID, il tuo livello aziendale, il livello dati ecc. Possono essere tutti condivisi, quindi la manutenzione di siti secondari separati diventa molto più semplice.

Opzione 2 d'altra parte, significa che continui a mantenere un solo sito, ma lo svantaggio che hai qui è di complessità.

Per utilizzare correttamente le query multimediali, devi progettare il tuo sito per un'unica piattaforma, solitamente desktop, quindi devi decidere quali regole desideri sovrascrivere e per quale larghezza dello schermo.

Sebbene questo non stia modificando rigorosamente il tuo sito in base allo user agent, stai ancora adattando il tuo layout a una determinata larghezza dello schermo, il che significa che su schermi più stretti (come un dispositivo mobile) stai mantenendo un'uscita leggibile, mentre solo dover modificare l'importo minimo necessario per mantenere tale leggibilità.

Questo tende ad essere il percorso che molti dei CMS prendono, in particolare i progetti di wordpress, perché richiede pochissimo codice e tutto può essere modificato direttamente nel CSS.

Tuttavia, sei limitato a cambiare solo ciò che può essere cambiato usando i CSS, e poiché c'è ancora un bel po 'di instabilità nelle specifiche CSS3, potresti scoprire che devi ancora limitare alcune delle modifiche che desideri fare.

Questo mi porta a Opzione 3 (questa è la mia opzione preferita) e al modo in cui lavoro per la maggior parte di ciò che faccio.

Disegna semplicemente il layout come un tipo di layout universale, che sebbene non sia bello, funziona genericamente sulla maggior parte dei dispositivi.

Quindi, collega il tuo toolkit UI preferito. (Per me questo è KnockoutJS mixato con Twitter Bootstrap).

Usa il tuo kit di strumenti dell'interfaccia utente per riempire le parti dinamiche del tuo layout, sulla base di un endpoint di riposo che annusa l'UA dalla richiesta.

Ad esempio. nel mio CSS potrei avere:

.rule_for_desktop
{
  color: blah;
  width: blah;
}

.rule_for_iphone
{
  color: blah;
  width: blah;
}

.rule_for_android
{
  color: blah;
  width: blah;
}

e nel mio modello di vista per knockout potrei avere:

var cssRule = ko.observable("rule_for_desktop");
// More code for the rest of the VM here

e nel mio HTML (basato sul knockout) potrei avere

<div id="myElement" data-bind="css: cssRule">... some content</div>

Quello che succede allora è il mio layout predefinito per un layout desktop (o qualsiasi altra cosa che ho impostato come predefinito nel mio viewmodel.

Se poi sparo una richiesta AJAX, o eseguo qualche sniffing UA nel codice JS, perché la mia proprietà 'cssRule' è osservabile la regola css usata nel mio mark up cambia istantaneamente, e ha effetto.

    
risposta data 11.05.2015 - 22:37
fonte

Leggi altre domande sui tag