Comment créer un texton en lecture seule dans ASP.NET MVC3 Razor

Comment créer une zone de texte en lecture seule dans ASP.NET MVC3, avec le moteur de vue Razor? Y a-t-il une méthode HTMLHelper disponible pour cela?

Quelque chose comme ça ?

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

 @Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" }) 

Nous vous invitons à créer un assistant HTML pour cela, mais il s’agit simplement d’un atsortingbut HTML comme un autre. Voulez-vous créer une aide HTML pour une zone de texte ayant d’autres atsortingbuts?

MISE À JOUR: Maintenant, il est très simple d’append des atsortingbuts HTML aux modèles d’éditeur par défaut. Moyens au lieu de faire ceci:

 @Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" }) 

vous pouvez simplement faire ceci:

 @Html.EditorFor(m => m.userCode, new { htmlAtsortingbutes = new { @readonly="readonly" } }) 

Avantages: Vous n’avez pas à appeler .TextBoxFor etc. pour les modèles. Appelez simplement .EditorFor .


Bien que la solution de @ Shark fonctionne correctement et soit simple et utile, ma solution (que j’utilise toujours) est celle-ci: Créez un editor-template capable de gérer l’atsortingbut readonly :

  1. Créez un dossier nommé EditorTemplates dans ~/Views/Shared/
  2. Créer un razor PartialView nommé Ssortingng.cshtml
  3. Remplissez le Ssortingng.cshtml avec ce 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. Dans la classe de modèle, placez l’atsortingbut [ReadOnly(true)] sur les propriétés que vous souhaitez utiliser en readonly .

par exemple

 public class Model { // [your-annotations-here] public ssortingng EditablePropertyExample { get; set; } // [your-annotations-here] [ReadOnly(true)] public ssortingng ReadOnlyPropertyExample { get; set; } } 

Maintenant, vous pouvez simplement utiliser la syntaxe par défaut de Razor:

 @Html.EditorFor(m => m.EditablePropertyExample) @Html.EditorFor(m => m.ReadOnlyPropertyExample) 

Le premier rend une zone de text-box normale comme ceci:

  

et le second rendra à;

  

Vous pouvez utiliser cette solution pour tout type de données ( DateTime , DateTimeOffset , DataType.Text , DataType.MultilineText , etc.). Créez simplement un editor-template .

La solution avec TextBoxFor est OK, mais si vous ne voulez pas voir le champ comme EditBox, il peut y avoir des modifications comme suit:

1. Code de razor avant les modifications

 
@Html.EditorFor(model => model.Text) @Html.ValidationMessageFor(model => model.Text)

2. Après les modifications

  
@Html.DisplayFor(model => model.Text)
@Html.HiddenFor(model => model.Text) @Html.ValidationMessageFor(model => model.Text)

Généralement, cette solution désactive le classement par rapport à l’édition mais en montre la valeur. Aucune modification de code-behind n’est nécessaire.

avec des crédits à la réponse précédente de @Bronek et @Shimmy

C’est ce que j’ai fait dans ASP.NET Core

   

La première entrée est en lecture seule et la seconde transmet la valeur à Controller et est masquée. Espérons que cela sera utile pour quelqu’un qui travaille avec ASP.Net Core.

  @Html.TextBox("Recivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" }) 
 @Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" }) 

C’est très bien pour la zone de texte. Cependant, si vous essayez de faire la même chose pour la checkbox essayez de l’utiliser si vous l’utilisez

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

Mais n’utilisez pas la disable car la désactivation envoie toujours la valeur par défaut false au serveur, que ce soit en mode coché ou non vérifié. Et le readonly ne fonctionne pas pour la case à cocher et le radio button . readonly ne fonctionne que pour les champs de text .

Vous pouvez utiliser le code ci-dessous pour créer une zone de texte en lecture seule.

Méthode -1

  @Html.TextBoxFor(model => model.Fields[i].TheField, new { @readonly = true }) 

Méthode -2

 @Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAtsortingbutes = new {disabled = "disabled"}})