Wie erstelle ich ein schreibgeschütztes Textfeld in ASP.NET MVC3 mit Razor View Engine? Gibt es dafür eine HTMLHelper-Methode?
Etwas wie das ?
@Html.ReadOnlyTextBoxFor(m => m.userCode)
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Sie können dazu gerne einen HTML-Helper erstellen, aber dies ist nur ein HTML-Attribut wie jedes andere. Möchten Sie einen HTML-Helfer für ein Textfeld erstellen, das andere Attribute hat?
UPDATE: Nun ist es sehr einfach, HTML-Attribute zu Standard-Editorvorlagen hinzuzufügen. Bedeutet statt dies zu tun:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
sie können das einfach tun:
@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })
Vorteile: Sie müssen .TextBoxFor
usw. nicht für Vorlagen aufrufen. Rufen Sie einfach .EditorFor
auf.
Während die Lösung von @ Shark korrekt arbeitet und einfach und nützlich ist, ist diese Lösung (die ich immer verwende) Create a editor-template
, das das readonly
-Attribut verarbeiten kann:
EditorTemplates
in ~/Views/Shared/
PartialView
mit dem Namen String.cshtml
Füllen Sie den 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" })
}
Setzen Sie in der Modellklasse das [ReadOnly(true)]
-Attribut auf Eigenschaften, die Sie als readonly
verwenden möchten.
z.B.
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 stellt einen normalen text-box
wie folgt dar:
<input class="text-box single-line" id="field-id" name="field-name" />
und die zweite wird zu machen;
<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 jeden Datentyp verwenden (DateTime
, DateTimeOffset
, DataType.Text
, DataType.MultilineText
usw.). Erstellen Sie einfach einen editor-template
.
Die Lösung mit TextBoxFor ist in Ordnung, aber wenn Sie das Feld nicht wie EditBox stylisch sehen wollen (es kann für den Benutzer wenig verwirrt sein), nehmen Sie folgende Änderungen vor:
1. Rasierercode vor Änderungen
<div class="editor-field">
@Html.EditorFor(model => model.Text)
@Html.ValidationMessageFor(model => model.Text)
</div>
2. 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>
In der Regel ist diese Lösung für das Bearbeiten von Dateien deaktiviert, zeigt jedoch den Wert .. .. Es sind keine Änderungen am Code notwendig.
mit Credits zur vorherigen Antwort von @Bronek und @Shimmy
Das ist, ich habe das gleiche in ASP.NET Core gemacht
<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />
Die erste Eingabe ist schreibgeschützt und die zweite übergibt den Wert an Controller und ist ausgeblendet.
Sie können den folgenden Code verwenden, um eine TextBox schreibgeschützt zu 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"}})
@Html.TextBox("Recivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })
Dies ist in Ordnung für ein Textfeld. Wenn Sie jedoch versuchen, dasselbe für die Variable checkbox
zu tun, verwenden Sie diese Option, wenn Sie sie verwenden
@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })
Verwenden Sie jedoch nicht disable
, da disable den Standardwert false immer an den Server sendet, entweder im aktivierten oder im ungeprüften Zustand. Die readonly
funktioniert nicht für das Kontrollkästchen und den radio button
. readonly
funktioniert nur für text
-Felder.