Risposte:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Sei libero di creare un Helper HTML per questo, ma questo è semplicemente un attributo HTML come qualsiasi altro. Realizzereste un Helper HTML per una casella di testo che ha altri attributi?
@
. Di solito lo vedrai solo con parole chiave che corrispondono agli attributi HTML (come readonly, class, ecc.)
@
per utilizzare attributi che corrispondono alle parole chiave C # .
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
AGGIORNAMENTO: ora è molto semplice aggiungere attributi HTML ai modelli di editor predefiniti. Neans invece di fare questo:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
puoi semplicemente fare questo:
@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })
Vantaggi: non devi chiamare .TextBoxFor
, ecc. Per i modelli. Chiama e basta .EditorFor
.
Mentre la soluzione di @ Shark funziona correttamente, ed è semplice e utile, la mia soluzione (che uso sempre) è questa: Crea un attributo editor-template
che possa gestirereadonly
:
EditorTemplates
in~/Views/Shared/
PartialView
denominatoString.cshtml
Compila String.cshtml
con questo codice:
@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" })
}
Nella classe del modello, metti l' [ReadOnly(true)]
attributo sulle proprietà che vuoi essere readonly
.
Per esempio,
public class Model {
// [your-annotations-here]
public string EditablePropertyExample { get; set; }
// [your-annotations-here]
[ReadOnly(true)]
public string ReadOnlyPropertyExample { get; set; }
}
Ora puoi usare semplicemente la sintassi predefinita di Razor:
@Html.EditorFor(m => m.EditablePropertyExample)
@Html.EditorFor(m => m.ReadOnlyPropertyExample)
Il primo rende una normale text-box
come questa:
<input class="text-box single-line" id="field-id" name="field-name" />
E il secondo renderà a;
<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />
È possibile utilizzare questa soluzione per qualsiasi tipo di dati ( DateTime
, DateTimeOffset
, DataType.Text
, DataType.MultilineText
e così via). Basta creare un file editor-template
.
La soluzione con TextBoxFor è OK, ma se non vuoi vedere il campo come EditBox alla moda (potrebbe essere un po 'di confusione per l'utente) coinvolgi le modifiche come segue:
Codice Razor prima delle modifiche
<div class="editor-field">
@Html.EditorFor(model => model.Text)
@Html.ValidationMessageFor(model => model.Text)
</div>
Dopo le modifiche
<!-- 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 genere, questa soluzione impedisce la modifica del campo, ma ne mostra il valore. Non sono necessarie modifiche code-behind.
Con i crediti alla risposta precedente di @Bronek e @Shimmy:
È come se avessi fatto la stessa cosa in ASP.NET Core:
<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />
Il primo input è di sola lettura e il secondo passa il valore al controller e viene nascosto. Spero che sia utile per qualcuno che lavora con ASP.NET Core.
@Html.TextBox("Receivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })
Questo va bene per la casella di testo. Tuttavia, se provi a fare lo stesso per il, checkbox
prova a usarlo se lo stai usando:
@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })
Ma non usare disable
, perché disable invia sempre il valore predefinito false
al server - sia nello stato selezionato che non selezionato. E readonly
non funziona per la casella di controllo e radio button
. readonly
funziona solo per i text
campi.
È possibile utilizzare il codice seguente per creare una casella di testo in sola lettura.
Metodo 1
@Html.TextBoxFor(model => model.Fields[i].TheField, new { @readonly = true })
Metodo 2
@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})
@
prefisso dellareadonly
proprietà. Vedi la mia modifica.