wake-up-neo.net

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

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)

103
Shyju
@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?

222
user596075

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:

  1. Erstellen Sie einen Ordner mit dem Namen EditorTemplates in ~/Views/Shared/
  2. Erstellen Sie einen Rasierer PartialView mit dem Namen String.cshtml
  3. 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" }) 
    }
    
  4. 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.

28
javad amiry

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.

5
Bronek

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.

1
Adithya Baddula

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"}})
0
 @Html.TextBox("Recivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
0
Hossein Dahr
@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.

0
gdmanandamohon