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


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

что-то вроде этого ?

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

7 101

7 ответов:

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

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

обновление: Теперь очень просто добавить атрибуты html в шаблоны редактора по умолчанию. Значит, вместо этого:

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

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

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

преимущества: вы не должны звонить .TextBoxFor etc. для шаблонов. Просто позвоните .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.

например

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.

решение с 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>

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

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

Это я сделал samething в ASP.NET ядро

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

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

 @Html.TextBox("Recivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })

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

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

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

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

способ -1

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

способ -2

@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})