Come creare una casella di testo di sola lettura in ASP.NET MVC3 Razor

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 :

  1. Crea una cartella denominata EditorTemplates in ~/Views/Shared/
  2. Crea un razor PartialView chiamato String.cshtml
  3. 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" }) } 
  4. 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"}})