Antworten:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Sie können gerne einen HTML-Helfer dafür erstellen, aber dies ist einfach nur ein HTML-Attribut wie jedes andere. Würden Sie einen HTML-Helfer für ein Textfeld mit anderen Attributen erstellen?
@
. Sie werden es normalerweise nur mit Schlüsselwörtern sehen, die mit HTML-Attributen übereinstimmen (wie schreibgeschützt, Klasse usw.)
@
, um Attribute zu verwenden, die mit C # -Schlüsselwörtern übereinstimmen .
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
UPDATE: Jetzt ist es sehr einfach, den Standardeditorvorlagen HTML-Attribute hinzuzufügen. Es bedeutet, anstatt dies zu tun:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Sie können dies einfach tun:
@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })
Vorteile: Sie müssen nicht anrufen .TextBoxFor
usw. für Vorlagen. Rufen Sie einfach an .EditorFor
.
Während die Lösung von @ Shark korrekt funktioniert und einfach und nützlich ist, lautet meine Lösung (die ich immer verwende) wie folgt: Erstellen Sie ein Attribut editor-template
, das mit readonly
Attributen umgehen kann :
EditorTemplates
in~/Views/Shared/
PartialView
NamenString.cshtml
Füllen Sie das String.cshtml
mit diesem Code:
@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" })
}
Fügen Sie in der Modellklasse das [ReadOnly(true)]
Attribut den Eigenschaften hinzu, die Sie sein möchten readonly
.
Beispielsweise,
public class Model {
// [your-annotations-here]
public string EditablePropertyExample { get; set; }
// [your-annotations-here]
[ReadOnly(true)]
public string ReadOnlyPropertyExample { get; set; }
}
Jetzt können Sie die Standardsyntax von Razor einfach verwenden:
@Html.EditorFor(m => m.EditablePropertyExample)
@Html.EditorFor(m => m.ReadOnlyPropertyExample)
Der erste macht eine Normalität text-box
wie folgt:
<input class="text-box single-line" id="field-id" name="field-name" />
Und der zweite wird rendern zu;
<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />
Sie können diese Lösung für jede Art von Daten ( DateTime
, DateTimeOffset
, DataType.Text
, DataType.MultilineText
und so weiter). Erstellen Sie einfach eine editor-template
.
Die Lösung mit TextBoxFor ist in Ordnung. Wenn Sie jedoch nicht möchten, dass das Feld wie EditBox stylisch angezeigt wird (dies kann für den Benutzer etwas verwirrend sein), müssen Sie folgende Änderungen vornehmen:
Rasiermessercode vor Änderungen
<div class="editor-field">
@Html.EditorFor(model => model.Text)
@Html.ValidationMessageFor(model => model.Text)
</div>
Nach Änderungen
<!-- 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>
Im Allgemeinen verhindert diese Lösung, dass Felder bearbeitet werden, zeigt jedoch den Wert an. Code-Behind-Änderungen sind nicht erforderlich.
Mit Credits zur vorherigen Antwort von @Bronek und @Shimmy:
Dies ist, als hätte ich dasselbe in ASP.NET Core getan:
<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />
Der erste Eingang ist schreibgeschützt und der zweite gibt den Wert an die Steuerung weiter und ist ausgeblendet. Ich hoffe, es ist nützlich für jemanden, der mit ASP.NET Core arbeitet.
@Html.TextBox("Receivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })
Dies ist in Ordnung für Textfelder. Wenn Sie jedoch versuchen, dasselbe für das zu tun, checkbox
versuchen Sie dies, wenn Sie es verwenden:
@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })
Verwenden Sie diese disable
Option jedoch nicht , da durch Deaktivieren immer der Standardwert false
an den Server gesendet wird - entweder im aktivierten oder im nicht aktivierten Status. Und das readonly
funktioniert nicht für Checkbox und radio button
. readonly
funktioniert nur für text
Felder.
Mit dem folgenden Code können Sie eine TextBox als schreibgeschützt erstellen.
Methode 1
@Html.TextBoxFor(model => model.Fields[i].TheField, new { @readonly = true })
Methode 2
@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})
@
Präfix derreadonly
Eigenschaft. Siehe meine Bearbeitung.