2013-02-21 8 views
14

ich eine Immobilie als Nur-Lese- in der Modellklasse markiert haben, wie folgt aus:Readonly-Attribut funktioniert nicht in ASP.NET MVC Modelle

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

und meiner Ansicht nach:

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

aber wenn ich die Anwendung ausführen, ist das Textfeld nicht Readonly.

Ich weiß, ich kann HTML-Attribute in der Ansicht verwenden, um es schreibgeschützt zu machen, aber ich würde es vorziehen, wenn dies in der Modellklasse selbst getan werden kann.

Kann es erreicht werden?

+0

+1 für den Versuch !! –

+0

gut wäre es nicht wäre es, glaubst du es ist Magie –

Antwort

14

[Update] Ich glaube nicht, es ohne new { @readonly = "readonly" } möglich ist. Eigenschaft Gibt an, ob die Eigenschaft, an die dieses Attribut gebunden ist, schreibgeschützt oder schreibgeschützt ist. Details Here.

Aber Sie könnten für Custom Helpers oder versuchen Editable statt Readonly auf dem Modell verwenden und verwenden die Metadaten-Eigenschaft in Ihrer View versuchen.

[Editable(false)] 

Ich denke, haben Sie schon sah in Does ReadOnly(true) work with Html.EditorForModel?

auch ein feiner Artikel odetocode.com

+0

Ein weiterer ausgezeichneter Punkt. Aber noch wichtiger, zähle nicht auf Anmerkungen für alles. Sie sind großartig, aber wir werden verwöhnt und erwarten, dass sie ein wenig zu oft nach uns wischen –

+5

Verwirrt, wie dies die ausgewählte Antwort ist.Ich habe ein triviales Beispielprojekt eingerichtet und diese Lösung funktioniert nicht.Die Antwort von Victor unten ist die einzige Lösung.Ich verstehe, dass er dies im Modell angeben möchte, aber so kann es nicht gemacht werden. – CoderSteve

+0

Ich möchte darauf hinweisen, dass während der Einstellung readonly in der HTML einen allgemeinen Benutzer daran hindert, die Textbox zu bearbeiten, kann jemand mit ein wenig Wissen in HTML und Javascript alles durcheinander bringen, so verlassen Sie sich nicht auf HTML-Attribute zu schützen Daten. Das Ziel besteht darin, zu verhindern, dass das Modell geändert wird, unabhängig davon, was am Frontend passiert ist. –

7

Das ReadOnly-Attribut setzt die Eingabe nicht auf schreibgeschützt.

Versuchen Sie, diese

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

danke, aber wie gesagt, ich möchte nicht den HTML-Weg, um dies zu tun, ich bin auf der Suche nach einer Lösung, die die "readonly "in den HTML-Code beim Lesen von Metadaten aus dem Modell –

+0

@EdiWang leider ist dies wahr. Ich wollte es selbst posten, als die Antwort kam. –

+0

@Dave A Oh, wirklich? Das ist nicht nett ..... :( –

0

Wenn Sie eine SETTER verwenden Sie verwenden müssen {get; privates Set; }. Das wird es so machen, dass der Client den Wert nicht ändern kann. Sie können auch einfach eine HTML-5-Eingabe verwenden und sie dort markieren.

9

ReadOnly Das Attribut blockiert den HMTL-Helper nicht, um das Feld als aktivierten Eingang anzuzeigen. Es ist eine Information, die die MVC Data Binder nur respektieren wird.

Es bedeutet, dass RegisterModel Instanz, die von einem Benutzer nach dem Formulareinreichung wird zurückgesendet, wird immer null Wert darauf UserName Eigenschaft ist, unabhängig von der Eingabe des Benutzers in dem entsprechenden Feld des Formulars.

+0

Ich habe völlig falsch verstanden, was 'ReadOnly' tut. Das hat es geklärt. Vielen Dank! – Bobson

Verwandte Themen