Nullable < > come modello per la visualizzazione della pagina
-
06-07-2019 - |
Domanda
Quali sono le possibili ragioni per cui Nullable < > i tipi non possono essere passati come parametro TModel di System.Web.Mvc.ViewPage < TModel > generico? Questo potrebbe essere utile a volte.
In ASP.NET il sorgente MVC ha definito quale TModel dovrebbe essere una classe:
public class ViewPage<TModel> : ViewPage where TModel : class
ma i tipi nullable sono tipi di valore. Forse la definizione potrebbe essere meno restrittiva ...
Soluzione
Non avrebbe senso che funzioni al momento, poiché ViewPage < T > internamente verifica sempre che il modello sia un'istanza di T. Non saresti mai in grado di passare null a causa di questo controllo.
Per quanto riguarda il motivo per cui i tipi di struttura non erano consentiti in primo luogo, c'erano una moltitudine di ragioni. Tra questi: (a) potrebbe incoraggiare le persone a usare tipi di struttura personalizzati per un modello, che non è quasi mai la cosa giusta da fare; (b) non è possibile passare un tipo di struttura come parametro a Controller.UpdateModel (); (c) i modelli dovrebbero avere uguaglianza di riferimento affinché i filtri possano ispezionarli e modificarli; (d) i tipi di struttura incorporati come int, ecc., normalmente non sono utili da soli come oggetto modello; e (e) i tipi di struttura non supportano l'ereditarietà, ad es. passare un modello int in una ViewPage < long > esploderebbe.
Si scopre che (c) probabilmente non è un problema perché i tipi di struttura dovrebbero essere immutabili, ma gli altri elementi richiedono che si consenta di prendere in considerazione i tipi di struttura e di prendere una decisione ampia prima di supportarli. Le conseguenze del loro supporto sono molto maggiori della semplice rimozione del vincolo su ViewPage < T > ;.
Altri suggerimenti
Un singolo valore non è in realtà un " modello " - potresti semplicemente usare il dizionario e il cast?