Come creare una casella di testo di sola lettura in ASP.NET MVC3, con il motore di visualizzazione Razor? C’è un metodo HTMLHelper disponibile per farlo?
Qualcosa come questo ?
@Html.ReadOnlyTextBoxFor(m => m.userCode)
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Puoi creare un helper HTML per questo, ma questo è semplicemente un attributo HTML come qualsiasi altro. Vuoi creare un helper HTML per una casella di testo che ha altri attributi?
AGGIORNAMENTO: ora è molto semplice aggiungere attributi html ai modelli di editor predefiniti. Significa 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 .TextBoxFor
chiamare .TextBoxFor
ecc. Per i modelli. Basta chiamare .EditorFor
.
Mentre la soluzione di @ Shark funziona correttamente ed è semplice e utile, la mia soluzione (che uso sempre) è questa Crea un editor-template
grado di gestire l’attributo readonly
:
EditorTemplates
in ~/Views/Shared/
PartialView
chiamato String.cshtml
Riempi il file 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 class del modello, inserisci l’attributo [ReadOnly(true)]
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 la syntax predefinita di razor semplicemente:
@Html.EditorFor(m => m.EditablePropertyExample) @Html.EditorFor(m => m.ReadOnlyPropertyExample)
Il primo, rende una normale text-box
come questa:
e il secondo, renderà a;
È ansible utilizzare questa soluzione per qualsiasi tipo di dati ( DateTime
, DateTimeOffset
, DataType.Text
, DataType.MultilineText
e così via). Basta creare un editor-template
.
La soluzione con TextBoxFor è OK ma se non vuoi vedere il campo come EditBox elegante (potrebbe essere poco confuso per l’utente) coinvolgere le modifiche come segue:
1. Codice del razor prima delle modifiche
@Html.EditorFor(model => model.Text) @Html.ValidationMessageFor(model => model.Text)
2. Dopo le modifiche
@Html.DisplayFor(model => model.Text) @Html.HiddenFor(model => model.Text) @Html.ValidationMessageFor(model => model.Text)
Generalmente questa soluzione viene disabilitata per la modifica ma mostra il valore di essa. Non c’è bisogno di modifiche code-behind.
con crediti alla risposta precedente di @Bronek e @Shimmy
Questo è ho fatto il samething in ASP.NET Core
Il primo input è in sola lettura e il secondo passa il valore a Controller ed è nascosto.Perché sarà utile per chi lavora con ASP.Net Core.
@Html.TextBox("Recivers", 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 la checkbox
prova a utilizzarlo se lo utilizzi
@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })
Ma non utilizzare disable
perché disabilita sempre inviare il valore predefinito falso al server o era in stato selezionato o deselezionato. E il readonly
non funziona per la casella di controllo e il radio button
opzione. readonly
funziona solo per text
campi di text
.
È ansible utilizzare sotto il codice per creare un TextBox come di 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"}})