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

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

Есть ли способ HTMLHelper для этого?

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

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

Ответ 1

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

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

Ответ 2

UPDATE: Теперь добавить шаблоны 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.

Ответ 3

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

  1. Код бритвы перед изменениями

    <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>
    

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

Ответ 4

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

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

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

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

Ответ 5

 @Html.TextBox("Receivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })

Ответ 6

@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.

Ответ 7

Вы можете использовать приведенный ниже код для создания 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"}})