c# asp.net-mvc-3 razor html-helper readonlyattribute

c# - Cómo crear un cuadro de texto de solo lectura en ASP.NET MVC3 Razor



razor c# (7)

La solución con TextBoxFor está bien, pero si no desea ver el campo como EditBox con estilo (podría ser un poco confuso para el usuario) involucrar los cambios de la siguiente manera:

1. Código Razor antes de los cambios

<div class="editor-field"> @Html.EditorFor(model => model.Text) @Html.ValidationMessageFor(model => model.Text) </div>

2. Después de los cambios

<!-- 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>

En general, esta solución deshabilita archivada en contra de la edición, pero muestra el valor de la misma. No hay necesidad de modificaciones de código subyacente.

¿Cómo crear un cuadro de texto de solo lectura en ASP.NET MVC3, con el motor Razor view? ¿Hay un método HTMLHelper disponible para hacer eso?

Algo como esto ?

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


Puede usar el siguiente código para crear un TextBox como de solo lectura.

Método 1

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

Método -2

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


con créditos a la respuesta anterior por @Bronek y @Shimmy

Esto es lo que hice en ASP.NET Core

<input asp-for="DisabledField" disabled="disabled" /> <input asp-for="DisabledField" class="hidden" />

La primera entrada es de solo lectura y la segunda pasa el valor a Controlador y está oculta. Espero que sea útil para alguien que trabaje con ASP.Net Core.


ACTUALIZACIÓN: ahora es muy simple agregar atributos html a plantillas de editor predeterminadas. Significa en lugar de hacer esto:

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

simplemente puedes hacer esto:

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

Beneficios: no tiene que llamar a .TextBoxFor etc. para plantillas. Solo llame a .EditorFor .

Si bien la solución de @ Shark funciona correctamente y es simple y útil, mi solución (que yo uso siempre) es esta. Cree una editor-template que pueda readonly atributo de readonly :

  1. Crea una carpeta llamada EditorTemplates en ~/Views/Shared/
  2. Crear una afeitadora PartialView llamada String.cshtml
  3. Complete el String.cshtml con este código:

    @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. En la clase de modelo, coloque el atributo [ReadOnly(true)] en las propiedades que desea que sean de readonly .

p.ej

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

Ahora puede usar la sintaxis predeterminada de razor simplemente:

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

El primero, renderiza un text-box normal como este:

<input class="text-box single-line" id="field-id" name="field-name" />

y el segundo, rendirá a;

<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />

Puede usar esta solución para cualquier tipo de datos ( DateTime , DateTimeOffset , DataType.Text , DataType.MultilineText , etc.). Solo crea una editor-template .


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


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

Le invitamos a hacer un HTML Helper para esto, pero esto es simplemente un atributo HTML como cualquier otro. ¿Haría un HTML Helper para un cuadro de texto que tiene otros atributos?


@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })

Esto está bien para el cuadro de texto. Sin embargo, si intenta hacer lo mismo para la checkbox , intente usar esto si lo usa

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

Pero no use disable porque desactivar siempre envía el valor predeterminado falso al servidor ya sea en estado marcado o no. Y el readonly no funciona para la casilla de verificación y radio button . readonly solo funciona para campos de text .