2013-02-21 11 views
14

ho segnato una proprietà come sola lettura nella classe del modello, in questo modo:attributo ReadOnly non funziona nei modelli ASP.NET MVC

public class RegisterModel 
{ 
    [Display(Name = "User name")] 
    [ReadOnly(true)] 
    public string UserName { get; set; } 
    ... 
} 

e, a mio avviso:

@Html.EditorFor(m => m.UserName) 

ma quando eseguo l'applicazione, la casella di testo non è in sola lettura.

So che è possibile utilizzare gli attributi html nella vista per renderlo di sola lettura, ma preferirei che ciò avvenga nella classe del modello stesso.

Può essere raggiunto?

+0

+1 per provare !! –

+0

beh non sarebbe, lo farebbe, pensi che sia magico –

risposta

14

[Update] Io non credo che sia possibile senza new { @readonly = "readonly" }. La proprietà Readonly specifica se la proprietà a cui è associato questo attributo è di sola lettura o di lettura/scrittura. Details Here.

Ma si potrebbe provare per Custom Helpers o provare Utilizzando Editable invece Readonly del modello e utilizzare la proprietà dei metadati nella vostra vista.

[Editable(false)] 

Credo che si hanno già esaminato Does ReadOnly(true) work with Html.EditorForModel?

anche un bell'articolo odetocode.com

+0

Un altro punto eccellente. Ma soprattutto, non contare su annotazioni per tutto. Sono fantastici, ma ci siamo lasciati viziare e ci aspettiamo che si puliscano un po 'troppo spesso dopo di noi –

+5

Sconcertato su come questa sia la risposta selezionata. Ho creato un progetto di esempio banale e questa soluzione non funziona. è l'unica soluzione.Capisco che voglia specificare questo nel modello, ma non può essere fatto in questo modo. – CoderSteve

+0

Mi piacerebbe sottolineare che mentre l'impostazione di readonly nell'html impedirà a un utente generico di modificare la casella di testo, chiunque abbia un po 'di conoscenza in html e javascript può rovinare tutto quindi non fare affidamento sugli attributi html per proteggere il tuo dati. L'obiettivo è impedire che il modello venga modificato indipendentemente da ciò che è accaduto sul front-end. –

7

L'attributo ReadOnly non imposta l'input in sola lettura.

Prova questa

Html.TextBoxFor(x => x.UserName, new { readonly = "readonly" }) 
+0

grazie, ma come ho detto, non voglio usare il modo html per farlo, sto cercando una soluzione che genererà il "readonly" "nel codice html durante la lettura dei metadati dal modello –

+0

@EdiWang purtroppo QUESTO È VERO. Stavo per pubblicarlo da solo quando è arrivata la risposta. –

+0

@Dave A Oh, davvero? Questo non è bello ..... :( –

0

Se stai usando un setter è necessario utilizzare {get; set privato; }. Ciò lo farà in modo che il client non possa modificare il valore. Puoi anche utilizzare un input HTML 5 e contrassegnarlo qui.

9

L'attributo ReadOnly non blocca l'helper HMTL per visualizzare il campo come input abilitato. È un'informazione che rispetterà solo il raccoglitore di dati MVC.

Significa che RegisterModel esempio, che sarà affisso ritorno dal modulo di invio da un utente, sarà ha sempre null valore è UserName proprietà, indipendentemente dall'ingresso dell'utente nel campo appropriato del modulo.

+0

Ho completamente frainteso ciò che 'ReadOnly' fa. Questo lo ha chiarito. Grazie! – Bobson

Problemi correlati