So erstellen Sie ein schreibgeschütztes Textfeld in ASP.NET MVC3 Razor


118

Wie erstelle ich ein schreibgeschütztes Textfeld in ASP.NET MVC3 mit der Razor View Engine?

Gibt es dafür eine HTMLHelper-Methode?

So etwas wie das Folgende?

@Html.ReadOnlyTextBoxFor(m => m.userCode)

Antworten:


246
@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?


1
@Shyju Entschuldigung, mir fehlte das @Präfix der readonlyEigenschaft. Siehe meine Bearbeitung.

7
Wenn Sie in Zukunft Fehler beim Hinzufügen von Eigenschaften zum dynamischen Objektargument erhalten, können Sie ihnen das vorangestellt haben @. Sie werden es normalerweise nur mit Schlüsselwörtern sehen, die mit HTML-Attributen übereinstimmen (wie schreibgeschützt, Klasse usw.)
Brad Christie

10
@BradChristie: Nein; Sie benötigen nur ein @, um Attribute zu verwenden, die mit C # -Schlüsselwörtern übereinstimmen .
SLaks

1
@BradChristie: Ich habe Ihren Kommentar falsch verstanden ("Schlüsselwörter" waren mehrdeutig)
SLaks

1
Wenn Sie mehrere HTML-Attribute haben, können Sie etwas tun wie:@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
Benscabbia

32

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 .TextBoxForusw. 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 readonlyAttributen umgehen kann :

  1. Erstellen Sie einen Ordner mit dem Namen EditorTemplatesin~/Views/Shared/
  2. Erstellen Sie einen Rasierer mit dem PartialViewNamenString.cshtml
  3. Füllen Sie das String.cshtmlmit 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" })
    }
  4. 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-boxwie 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.MultilineTextund so weiter). Erstellen Sie einfach eine editor-template.


2
+1, weil Sie "ViewData.ModelMetadata.IsReadOnly" verwendet haben. Ich hatte erwartet, dass MVC diese
Dinge

@cleftheris gut, wir sind jetzt in Version 5, und MVC hat sie immer noch nicht genommen;)
Ravy Amyy

2
@Javad_Amiry - tolle Antwort - Ich habe es implementiert und es schien großartig zu funktionieren, bis ich auf einer Scaffolded Edit-Seite auf Speichern geklickt habe. Dann stellt sich heraus, dass Eigenschaften mit [ReadOnly (true)] dazu führen, dass NULL anstelle des tatsächlichen Eigenschaftswerts an die Datenbank gesendet wird. Sind Sie darauf gestoßen?
Percy

5

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:

  1. Rasiermessercode 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>

Im Allgemeinen verhindert diese Lösung, dass Felder bearbeitet werden, zeigt jedoch den Wert an. Code-Behind-Änderungen sind nicht erforderlich.


1
Ich denke, dass es sehr hilfreich sein könnte, das CSS für das Klasseneditorfeld und das Anzeigefeld hier zu haben.
DOK

Was meinst du mit "diese Lösung deaktiviert das Ablegen gegen Bearbeitung" (es scheint unverständlich)? Bitte antworten Sie, indem Sie Ihre Antwort bearbeiten , nicht hier in den Kommentaren (falls zutreffend).
Peter Mortensen

3

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.


0
 @Html.TextBox("Receivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })

1
Eine Erklärung wäre angebracht.
Peter Mortensen

0
@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, checkboxversuchen Sie dies, wenn Sie es verwenden:

@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })

Verwenden Sie diese disableOption jedoch nicht , da durch Deaktivieren immer der Standardwert falsean den Server gesendet wird - entweder im aktivierten oder im nicht aktivierten Status. Und das readonlyfunktioniert nicht für Checkbox und radio button. readonlyfunktioniert nur für textFelder.


Was ist mit Dropdown-Listen?
user3020047


0

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"}})
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.