Respuestas:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Puede crear un HTML Helper para esto, pero esto es simplemente un atributo HTML como cualquier otro. ¿Haría un ayudante HTML para un cuadro de texto que tiene otros atributos?
@
. Por lo general, solo lo verá con palabras clave que coincidan con atributos HTML (como solo lectura, clase, etc.)
@
usar atributos que coincidan con las palabras clave de C # .
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
ACTUALIZACIÓN: Ahora es muy sencillo agregar atributos HTML a las plantillas de editor predeterminadas. Neans 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 tienes que llamar .TextBoxFor
, etc. para obtener plantillas. Solo llama .EditorFor
.
Si bien la solución de @ Shark funciona correctamente, y es simple y útil, mi solución (que uso siempre) es esta: Crear un atributo editor-template
que pueda manejarreadonly
:
EditorTemplates
en~/Views/Shared/
PartialView
llamadaString.cshtml
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" })
}
En la clase de modelo, coloque el [ReadOnly(true)]
atributo en las propiedades que desea ser readonly
.
Por ejemplo,
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 hace un normal text-box
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" />
Se puede utilizar esta solución para cualquier tipo de datos ( DateTime
, DateTimeOffset
, DataType.Text
, DataType.MultilineText
etc.). Simplemente cree un editor-template
.
La solución con TextBoxFor está bien, pero si no desea ver el campo como EditBox con estilo (puede ser un poco confuso para el usuario), incluya los siguientes cambios:
Código Razor antes de cambios
<div class="editor-field">
@Html.EditorFor(model => model.Text)
@Html.ValidationMessageFor(model => model.Text)
</div>
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>
Generalmente, esta solución evita que el campo se edite, pero muestra su valor. No es necesario realizar modificaciones de código subyacente.
Con créditos a la respuesta anterior de @Bronek y @Shimmy:
Esto es como si hubiera hecho lo mismo 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 al controlador y está oculta. Espero que sea útil para alguien que trabaje 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" })
Esto está bien para el cuadro de texto. Sin embargo, si intenta hacer lo mismo para el checkbox
, intente usar esto si lo está usando:
@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })
Pero no lo use disable
, porque deshabilitar siempre envía el valor predeterminado false
al servidor, ya sea en el estado marcado o no marcado. Y readonly
no funciona para la casilla de verificación y radio button
. readonly
solo funciona para text
campos.
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"}})
@
prefijo de lareadonly
propiedad. Ver mi edición.