ASP.net MVC v2 - Modelli di stile
-
22-07-2019 - |
Domanda
Mi chiedo solo se qualcuno ha qualche idea su come possiamo modellare i modelli ... Come se volessi cambiare la MaxLength di una casella di testo come posso fare per farlo.
Quello che vorrei poter fare è qualcosa di simile a quello che posso fare in WPF con stili e modelli ... In WPF puoi passare attraverso gli stili ai modelli e scegliere dove applicare quegli stili ... Per istanze se l'utente imposta la larghezza su un controllo (che è il modello), all'interno del codice di controllo posso scegliere di applicare quella larghezza a qualsiasi elemento desiderato all'interno del modello o a nessuno ...
Quindi mi chiedevo se qualcuno sapesse qualcosa di simile?
Soluzione
Ho pubblicato una risposta a una domanda simile qui .
Se si desidera stili generici, è possibile derivare i modelli dei modelli personalizzati dalla classe TemplateViewModel di base che supporterà gli stili richiesti:
public interface ITextSpecifier
{
int? Size { get; }
bool AutoGrow { get; }
}
public class TemplateViewModel<T> where T: class
{
public IDictionary<string, string> Attributes { get; }
public ITextSpecifier TextStyle { get; private set; }
public IColorSpecifier ColorStyle { get; }
public T TextStyle(int size, bool autogrow)
{
TextStyle = new TextSpecifier(size, autogrow);
return this;
}
}
public class TextBoxViewModel: TemplateViewModel<TextBoxViewModel>
{
}
<%= Html.EditorFor(x => new TextBoxViewModel(Model.StringData).TextStyle(10, false)) %>
Nel modello:
<!-- template page derived from typed control for TextBoxViewModel -->
<input type='text' <%= Model.TextStyle.Size != null
? "size='" + Model.TextStyle.Size + "'" : "" %> ... />
È un po 'di lavoro, ecco perché spero che inventeranno un metodo comune nella versione MVC v2.
Altri suggerimenti
La soluzione qui è usare i metadati! È possibile riutilizzare l'attributo di convalida dell'annotazione dei dati StringLength qui. Crea un nuovo provider di metadati che legge la lunghezza massima dall'attributo StringLength e lo inserisce nel dizionario AdditionalValues. Il provider di metadati deve ereditare da DataAnnotationsModelMetadataProvider. E poi nel modello che crei, in DisplayTemplates o EditorTemplates, puoi accedere alla lunghezza massima della stringa.
Il modo più semplice per farlo, per quanto ne so, è creare un ID HTML per la casella di testo come mostrato di seguito:
@Html.EditorFor(model => model.Description, null, "Description", null)
E alla fine della pagina, scrivi il seguente javascript
<script type="text/javascript">
$(function () { $("#Description").css("width","450"); });
</script>
NB: - Anche io odio MVC !!!