StringLength vs MaxLength attribuisce ASP.NET MVC con Entity Framework EF Code First


152

Qual è la differenza nel comportamento [MaxLength]e negli [StringLength]attributi?

Per quanto ne so (con l'eccezione che [MaxLength]può validare la lunghezza massima di un array) questi sono identici e in qualche modo ridondanti?


1
Non sono sicuro su ASP.NET MVC, ma per EF ci dovrebbe essere alcuna differenza: stackoverflow.com/questions/5414611/...
Ladislav Mrnka

1
StringLength non influisce sulla dimensione del collo delle migrazioni quando la modifichi.
Cas Bloem,

@CasBloem StringLength infatti viene rilevato da EntityFramework e avrà un impatto sulla lunghezza delle colonne - almeno nella versione 6.
jakejgordon,

Risposte:


203

MaxLength viene utilizzato per Entity Framework per decidere quanto è grande creare un campo valore stringa quando crea il database.

Da MSDN:

Specifica la lunghezza massima dei dati dell'array o della stringa consentiti in una proprietà.

StringLength è un'annotazione di dati che verrà utilizzata per la convalida dell'input dell'utente.

Da MSDN:

Specifica la lunghezza minima e massima dei caratteri consentiti in un campo dati.


10
Si noti inoltre che per impostazione predefinita MVC 3 non riconosce MaxLengthAttribute, mentre EF riconosceStringLengthAttribute
marcind

15
Quindi davvero non è necessario MaxLength poiché è possibile utilizzare StringLength in EF e influisce anche sulla dimensione del campo stringa. Perché allora hanno persino creato MaxLength?
Matt Johnson-Pint,

4
@MattJohnson - Mi sembra di ricordare che la decisione di creare un nuovo attributo MaxLength era per la semantica perché StringLength implica dati stringa, ma MaxLength può applicarsi anche ai dati binari. Ma sicuramente è scomodo.
Josh

1
@MartinSmith - Ho appena provato a utilizzare StringLength e ha funzionato per me e sto usando EF6 RC1, quindi non credo che i commenti siano corretti
Colin,

5
Perché [MaxLength]allora ha un ErrorMessage?
Zapnologica,

46

Alcune informazioni aggiuntive rapide ma estremamente utili che ho appena appreso da un altro post, ma non riesco a trovare la documentazione per (se qualcuno può condividere un link su MSDN sarebbe fantastico):

I messaggi di convalida associati a questi attributi sostituiranno effettivamente i segnaposto associati agli attributi. Per esempio:

[MaxLength(100, "{0} can have a max of {1} characters")]
public string Address { get; set; }

Verrà visualizzato quanto segue se supera il limite di caratteri: "L'indirizzo può contenere un massimo di 100 caratteri"

I segnaposto di cui sono a conoscenza sono:

  • {0} = Nome proprietà
  • {1} = Lunghezza massima
  • {2} = Lunghezza minima

Mille grazie a Bloudraak per averlo inizialmente sottolineato.


12

Di seguito sono riportati i risultati quando utilizziamo entrambi [MaxLength]e gli [StringLength]attributi, in EF code first. Se vengono utilizzati entrambi, [MaxLength]vince la gara. Vedi il risultato del test nella studentnamecolonna sotto la classe

 public class Student
 {
    public Student () {}

    [Key]
    [Column(Order=1)]
    public int StudentKey { get; set; }

    //[MaxLength(50),StringLength(60)]    //studentname column will be nvarchar(50)
    //[StringLength(60)]    //studentname column will be nvarchar(60)
    [MaxLength(50)] //studentname column will be nvarchar(50)
    public string StudentName { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }
 }

7

Tutte le risposte valide ... Dal punto di vista della convalida, ho anche notato che MaxLength viene convalidato solo sul lato server, mentre StringLength viene convalidato anche sul lato client.




1

L'ho risolto aggiungendo la riga seguente nel mio contesto:

modelBuilder.Entity<YourObject>().Property(e => e.YourColumn).HasMaxLength(4000);

In qualche modo, [MaxLength]non ha funzionato per me.


0

Quando si utilizza l'attributo per limitare la lunghezza massima di input per il testo da un modulo in una pagina Web, StringLength sembra generare l'attributo html maxlength (almeno nel mio test con MVC 5). Quello da scegliere dipende quindi da come si desidera avvisare l'utente che questa è la lunghezza massima del testo. Con l'attributo stringlength, l'utente non sarà in grado di digitare oltre la lunghezza consentita. L'attributo maxlength non aggiunge questo attributo html, ma genera attributi di convalida dei dati, il che significa che l'utente può digitare oltre la lunghezza indicata e che impedire input più lunghi dipende dalla convalida in javascript quando si sposta sul campo successivo o fa clic su Invia (o se JavaScript è disabilitato, convalida lato server). In questo caso l'utente può essere informato della restrizione tramite un messaggio di errore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.