Как создать текстовое поле только для чтения в ASP.NET MVC3 с механизмом представления Razor?
Есть ли способ HTMLHelper для этого?
Что-то вроде следующего?
@Html.ReadOnlyTextBoxFor(m => m.userCode)
Как создать текстовое поле только для чтения в ASP.NET MVC3 с механизмом представления Razor?
Есть ли способ HTMLHelper для этого?
Что-то вроде следующего?
@Html.ReadOnlyTextBoxFor(m => m.userCode)
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Вы можете создать HTML-помощник для этого, но это просто атрибут HTML, как и любой другой. Вы сделали бы HTML-помощник для текстового поля с другими атрибутами?
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
:
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
, потому что 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"}})