Как создать текстовое поле только для чтения в ASP.NET MVC3 Razor - PullRequest
108 голосов
/ 06 января 2012

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

Как-то так?

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

Ответы [ 7 ]

229 голосов
/ 06 января 2012
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

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

29 голосов
/ 28 июля 2012

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

Теперь вы можете использовать стандартный синтаксис бритвы просто:

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

5 голосов
/ 27 ноября 2012

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

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>

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

2 голосов
/ 08 июня 2016

с кредитами к предыдущему ответу @Bronek и @ Shimmy

Это я сделал то же самое в ASP.NET Core

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

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

0 голосов
/ 03 апреля 2018

Вы можете использовать приведенный ниже код для создания 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"}})
0 голосов
/ 04 октября 2017
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })

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

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

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

0 голосов
/ 28 сентября 2016
 @Html.TextBox("Recivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
...