Ответы:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Вы можете создать для этого HTML-помощник, но это просто атрибут HTML, как и любой другой. Вы бы создали помощник HTML для текстового поля с другими атрибутами?
@
. Обычно вы видите это только с ключевыми словами, которые соответствуют атрибутам HTML (например, только для чтения, класс и т. Д.)
@
для использования атрибутов, соответствующих ключевым словам C # .
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
ОБНОВЛЕНИЕ: теперь очень просто добавлять атрибуты 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
атрибут :
EditorTemplates
в~/Views/Shared/
PartialView
именемString.cshtml
Заполните 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" })
}
В классе модели поместите [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
.
Решение с TextBoxFor в порядке, но если вы не хотите видеть поле типа EditBox style (это может немного сбить с толку пользователя), внесите следующие изменения:
Код Razor до изменений
<div class="editor-field">
@Html.EditorFor(model => model.Text)
@Html.ValidationMessageFor(model => model.Text)
</div>
После изменений
<!-- 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:
Это похоже на то, что я сделал то же самое в ASP.NET Core:
<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />
Первый ввод доступен только для чтения, а второй передает значение контроллеру и скрыт. Надеюсь, это будет полезно для тех, кто работает с ASP.NET Core.
@Html.TextBox("Receivers", 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
, потому что disable всегда отправляет на false
сервер значение по умолчанию - либо оно было отмечено, либо нет. И readonly
не работает для флажка и radio button
. readonly
работает только для text
полей.
Вы можете использовать приведенный ниже код для создания 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"}})
@
префиксаreadonly
свойства. Смотрите мою правку.