Изменилось ли поведение для DataAnnotations в asp.net mvc 3?

У меня есть модель со свойством

[ReadOnly(true)]
public decimal BodyMassIndex { get; private set; }

На мой взгляд, когда я звоню

@Html.EditorForModel()

Я все еще получаю стандартное редактируемое текстовое поле для этого свойства

Почему это? если текстовое поле все еще редактируемо, какой смысл в этом DataAnnotation Attibute?

Пост Брэда Уилсона

5 ответов

Это не атрибут DataAnnotation. Обратите внимание, что он находится в пространстве имен System.ComponentModel. Аннотации данных находятся в пространстве имен System.ComponentModel.DataAnnotations.

Тем не менее, это тот случай, когда мы могли бы рассмотреть возможность его поддержки. Но что именно вы ожидали, и почему вы этого хотите?

Ты можешь использовать

@Html.TextBoxFor(x=> x.ModelProperty, new { @readonly="readonly"})

Из того, что я понимаю по вашему вопросу и по комментариям к другим ответам, вы просто хотите отобразить BodyMassIndex, а не редактировать его.

Если это так, используйте @Html.DisplayFor скорее, чем @Html.EditorFor,

AFAIK атрибут ReadOnlyAttribute предназначен для свойства класса. Из MSDN

 Members that are marked with the ReadOnlyAttribute set to true or that do not have a Set method 
 cannot be changed. Members that do not have this attribute or that are marked with the 
 ReadOnlyAttribute set to false are read/write, and they can be changed. The default is No.

Таким образом, вы используете это внутри ваших классов, чтобы предотвратить изменение свойств. (по крайней мере, значение, которое я даю этому атрибуту)

Если вы хотите, чтобы текстовое поле только для чтения, используйте что-то подобное

 @Html.TextBox("MyText", "my text", new { @readonly="readonly" })

@ first readonly говорит компилятору обойти зарезервированное слово

Это работает в Vs2013 C# с Bootstrap 3.

            <div class="form-group">
                @Html.LabelFor(model => model.PasswordHash, htmlAttributes: new { @class = "control-label col-md-3" })
                <div class="col-md-6">
                    @Html.EditorFor(model => model.PasswordHash, new { htmlAttributes = new { @class = "form-control", @readonly="readonly" } })
                    @Html.ValidationMessageFor(model => model.PasswordHash, "", new { @class = "text-danger" })
                </div>
            </div>
Другие вопросы по тегам