Как создать текстовое поле только для чтения в ASP.NET MVC3 Razor

Как создать текстовое поле только для чтения в ASP.NET MVC3 с помощью механизма просмотра Razor?

Есть ли для этого метод HTMLHelper?

Что-то вроде следующего?

@Html.ReadOnlyTextBoxFor(m => m.userCode)

person Shyju    schedule 06.01.2012    source источник


Ответы (7)


@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

Вы можете создать для этого HTML-помощник, но это просто атрибут HTML, как и любой другой. Вы бы создали помощник HTML для текстового поля с другими атрибутами?

person Community    schedule 06.01.2012
comment
@Shyju Извините, мне не хватало префикса @ свойства readonly. Смотрите мою правку. - person ; 06.01.2012
comment
В будущем, если вы получите какие-либо ошибки при добавлении свойств к аргументу динамического объекта, вы можете добавить к ним префикс @. Обычно вы видите его только с ключевыми словами, которые соответствуют атрибутам HTML (например, только для чтения, класс и т. Д.) - person Brad Christie; 06.01.2012
comment
@BradChristie: Нет; вам нужен только @, чтобы использовать атрибуты, соответствующие ключевым словам C #. - person SLaks; 06.01.2012
comment
@SLaks: Разве я не это сказал? ;-) - person Brad Christie; 06.01.2012
comment
@BradChristie: Я неправильно прочитал ваш комментарий (ключевые слова были неоднозначными) - person SLaks; 06.01.2012
comment
Если у вас есть несколько атрибутов html, вы можете сделать что-то вроде: @Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" }) - person benscabbia; 28.01.2017

ОБНОВЛЕНИЕ: теперь очень просто добавлять атрибуты HTML в шаблоны редактора по умолчанию. Вместо этого нужно:

@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

вы просто можете сделать это:

@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })

Преимущества: Вам не нужно вызывать .TextBoxFor и т. Д. Для получения шаблонов. Просто позвоните .EditorFor.


Хотя решение @Shark работает правильно, оно простое и полезное, мое решение (которое я использую всегда) таково: Создайте editor-template, который может обрабатывать атрибут readonly:

  1. Создайте папку с именем EditorTemplates в ~/Views/Shared/
  2. Создайте бритву PartialView с названием String.cshtml
  3. Заполните String.cshtml этим кодом:

    @if(ViewData.ModelMetadata.IsReadOnly) {
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
            new { @class = "text-box single-line readonly", @readonly = "readonly", disabled = "disabled" })
    } else {
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
            new { @class = "text-box single-line" })
    }
    
  4. В классе модели поместите атрибут [ReadOnly(true)] в свойства, которые должны быть readonly.

Например,

public class Model {
    // [your-annotations-here]
    public string EditablePropertyExample { get; set; }

    // [your-annotations-here]
    [ReadOnly(true)]
    public string ReadOnlyPropertyExample { get; set; }
}

Теперь вы можете просто использовать синтаксис Razor по умолчанию:

@Html.EditorFor(m => m.EditablePropertyExample)
@Html.EditorFor(m => m.ReadOnlyPropertyExample)

Первый отображает нормальный text-box следующим образом:

<input class="text-box single-line" id="field-id" name="field-name" />

А второй будет обрабатывать;

<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />

Вы можете использовать это решение для любого типа данных (DateTime, DateTimeOffset, DataType.Text, DataType.MultilineText и так далее). Просто создайте editor-template.

person amiry jd    schedule 28.07.2012
comment
+1, потому что вы использовали ViewData.ModelMetadata.IsReadOnly. Я ожидал, что MVC учтет все это в версии 4. - person cleftheris; 24.10.2012
comment
@clefther, ну, сейчас мы находимся в версии 5, а MVC их еще не принял;) - person amiry jd; 23.07.2014
comment
@Javad_Amiry - отличный ответ - я реализовал его, и, похоже, он отлично работал, пока я не нажал Сохранить на странице редактирования с шаблоном. Затем оказывается, что свойства с [ReadOnly (true)] приведут к отправке в базу данных NULL вместо реального значения свойства. Вы сталкивались с этим? - person Percy; 25.03.2015

Решение с TextBoxFor в порядке, но если вы не хотите видеть поле типа EditBox стильно (это может немного сбить с толку пользователя), внесите следующие изменения:

  1. Код Razor до изменений

    <div class="editor-field">
         @Html.EditorFor(model => model.Text)
         @Html.ValidationMessageFor(model => model.Text)
    </div>
    
  2. После изменений

    <!-- New div display-field (after div editor-label) -->
    <div class="display-field">
        @Html.DisplayFor(model => model.Text)
    </div>
    
    <div class="editor-field">
        <!-- change to HiddenFor in existing div editor-field -->
        @Html.HiddenFor(model => model.Text)
        @Html.ValidationMessageFor(model => model.Text)
    </div>
    

Как правило, это решение предотвращает редактирование поля, но показывает его значение. Нет необходимости в модификации кода программной части.

person Bronek    schedule 27.11.2012
comment
Я думаю, что наличие здесь CSS для полей редактора классов и поля отображения может быть действительно полезным. - person DOK; 30.10.2014
comment
Что вы имеете в виду под этим решением запрещает редактирование, (это кажется непонятным)? Пожалуйста, ответьте, отредактировав свой ответ, а не здесь, в комментариях (при необходимости). - person Peter Mortensen; 16.09.2019

С кредитами на предыдущий ответ @Bronek и @Shimmy:

Это похоже на то, что я проделал то же самое в ASP.NET Core:

<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />

Первый ввод доступен только для чтения, а второй передает значение контроллеру и скрыт. Надеюсь, это будет полезно для тех, кто работает с ASP.NET Core.

person Adithya Baddula    schedule 08.06.2016

@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })

Это нормально для текстового поля. Однако, если вы попытаетесь сделать то же самое для checkbox, попробуйте использовать это, если вы его используете:

@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })

Но не используйте disable, потому что disable всегда отправляет на сервер значение по умолчанию false - либо оно было в отмеченном, либо в не отмеченном состоянии. И readonly не работает для флажка и radio button. readonly работает только для text полей.

person gdmanandamohon    schedule 04.10.2017
comment
А как насчет раскрывающихся списков? - person user3020047; 13.04.2020
comment
Надеюсь, это поможет stackoverflow.com/questions/1636103/ - person gdmanandamohon; 13.04.2020

Вы можете использовать приведенный ниже код для создания TextBox только для чтения.

Метод 1

 @Html.TextBoxFor(model => model.Fields[i].TheField, new { @readonly = true })

Способ 2

@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})
person Krishan Dutt Sharma    schedule 03.04.2018

person    schedule
comment
Объяснение было бы в порядке. - person Peter Mortensen; 16.09.2019