Уже занятая тема, но из того, что я прочитал здесь, следующее помогло мне понять, как она работает внутри:
def bar(a=[]):
print id(a)
a = a + [1]
print id(a)
return a
>>> bar()
4484370232
4484524224
[1]
>>> bar()
4484370232
4484524152
[1]
>>> bar()
4484370232 # Never change, this is 'class property' of the function
4484523720 # Always a new object
[1]
>>> id(bar.func_defaults[0])
4484370232
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Вы можете сделать HTML Helper для этого, но это просто атрибут HTML, как и любой другой. Вы сделаете HTML-помощник для текстового поля с другими атрибутами?
с записями к предыдущему ответу @Bronek и @Shimmy
Это я сделал что-то в ASP.NET Core
<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />
. Первый вход - только для чтения и второй передает значение Контроллеру и скрыт. Надеюсь, это будет полезно для кого-то, кто работает с ASP.Net Core.
@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
.
@Html.TextBox("Recivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
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; }
}
Теперь вы можете просто использовать синтаксис по умолчанию бритвы:
@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
.
Вы можете использовать нижеприведенный код для создания 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"}})
Решение с 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>
Обычно это решение отключается от редактирования, но показывает его значение. Нет необходимости в модификациях кода.
@
свойстваreadonly
. См. Мое редактирование. – user 6 January 2012 в 19:36@
. Обычно вы видите только ключевые слова, соответствующие атрибутам HTML (например, readonly, class и т. Д.). – Brad Christie 6 January 2012 в 19:40@
использовать атрибуты, соответствующие ключевым словам C # . – SLaks 6 January 2012 в 19:55@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
– benscabbia 28 January 2017 в 18:20