Відповіді:
@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 стильним (це може бути трохи заплутано для користувача), введіть такі зміни:
Код бритви перед змінами
<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
, тому що вимкнення завжди надсилає 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
властивості. Дивіться мою редакцію.