2013-02-21 2 views
14

Я маркированных свойство, как только для чтения в классе модели, как это:ReadOnly атрибут не работает в ASP.NET MVC модели

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

и на мой взгляд:

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

, но при запуске приложения текстовое поле не только для чтения.

Я знаю, что могу использовать атрибуты html в представлении, чтобы сделать его только для чтения, но я бы предпочел, чтобы это можно было сделать в самом классе модели.

Можно ли достичь?

+0

+1 для пробуждения !! –

+0

ну это было бы не так, как вы думаете, это волшебство –

ответ

14

[Update] Я не думаю, что это возможно без new { @readonly = "readonly" }. Свойство Readonly указывает, является ли свойство, к которому привязан этот атрибут, только для чтения или чтения/записи. Details Here.

Но вы могли бы попробовать Custom Helpers или попробовать использовать Editable вместо Readonly на модели и использовать свойство метаданных в вашем View.

[Editable(false)] 

Я думаю, вы уже смотрели в Does ReadOnly(true) work with Html.EditorForModel?

также штраф статьи odetocode.com

+0

Еще один отличный момент. Но что еще более важно, не рассчитывайте на аннотации на все. Они великолепны, но мы избалованы и ожидаем, что они будут слишком быстро протирать нас. –

+5

Непонятно, как это выбранный ответ. Я создал тривиальный образец проекта, и это решение не работает. является единственным решением.Я понимаю, что он хочет указать это в модели, но этого не может быть сделано. – CoderSteve

+0

Я хотел бы указать, что при установке его только в html-файле пользователь не сможет редактировать текстовое поле, любой, у кого мало знаний в html и javascript, может повредить все, поэтому не полагайтесь на атрибуты html, чтобы защитить свои данные. Цель состоит в том, чтобы предотвратить изменение модели независимо от того, что произошло на передней панели. –

7

Атрибут ReadOnly не устанавливает ввод только для чтения.

Попробуйте

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

спасибо, но, как я уже сказал, я не хочу использовать html-способ для этого, я ищу какое-то решение, которое будет генерировать «readonly "в html при чтении метаданных из модели –

+0

@EdiWang, к сожалению, ЭТО ИСТИННО. Я собирался опубликовать его сам, когда подошел ответ. –

+0

@ Dave A О, правда? Это не приятно ..... :( –

0

Если вы используете сеттер вы должны использовать {получить; частный набор; }. Это сделает так, чтобы клиент не мог изменить значение. Вы также можете просто использовать вход HTML 5 и пометить его там.

9

ReadOnly Атрибут не блокирует хелпер HMTL для отображения поля в качестве разрешенного ввода. Это информация, которую будут уважать только данные MVC Data Binder.

Это означает, что RegisterModel экземпляр, который будет размещен назад после отправки формы пользователя, будет всегда имеет значение null на это UserName имущества, независимо от входа пользователя в соответствующем поле формы.

+0

Я полностью не понял, что делает «ReadOnly». Это прояснило это. Благодаря! – Bobson

Смежные вопросы