2012-01-06 55 views

Respuesta

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

que son bienvenidos a hacer un ayudante HTML 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?

+1

@Shyju Disculpa, me faltaba el prefijo '@' de la propiedad 'readonly'. Ver mi edición –

+7

En el futuro, si obtiene algún tipo de error al agregar propiedades al argumento del objeto dinámico, puede prefijarlas con '@'. Por lo general, solo lo verá con palabras clave que coincidan con los atributos HTML (como readonly, clase, etc.) –

+9

@BradChristie: No; solo necesita un '@' para usar atributos que coincidan con las palabras clave ** C# **. – SLaks

27

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

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

simplemente puede hacer esto:

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

Beneficios: Usted no tiene que llamar .TextBoxFor etc para las plantillas. Simplemente llame al .EditorFor.


Mientras @ solución de tiburón funciona correctamente y es simple y útil, mi solución (que yo uso siempre) es éste Crear editor-template que pueden asas readonly atributos:

  1. Crear una carpeta denominada EditorTemplates en ~/Views/Shared/
  2. Crear una navaja PartialView llamado String.cshtml
  3. Llenar 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, poner el atributo [ReadOnly(true)] sobre las propiedades que desea ser readonly.

e.g.

public class Model { 
    // [your-annotations-here] 
    public string EditablePropertyExample { get; set; } 

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

Ahora puede utilizar la sintaxis predeterminada de la maquinilla de afeitar simplemente:

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

La primera de ellas, hace que una normal de text-box así:

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

y el segundo, pagará 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 y así sucesivamente). Solo crea un editor-template.

+2

+1 porque usaste "ViewData.ModelMetadata.IsReadOnly". Yo estaba esperando MVC tendría en cuenta estas cosas en la versión 4. – cleftheris

+0

@cleftheris así estamos en la versión 5 ahora, y MVC todavía no tardaron;) –

+1

Muy útil - gracias :) – Nildarar

5

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

1. Código de afeitar antes cambia

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

+1

Creo que tener el CSS para el campo editor de clases y el campo de visualización aquí podría ser muy útil. – DOK

1

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

esto es que lo han hecho el samething en ASP.NET Core

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

La primera entrada es de sólo lectura y el segundo pasa por el valor para el controlador y está oculto. Espero que sea útil para alguien que trabaja con ASP.Net Core.

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

Esto está muy bien para la caja de texto. Sin embargo, si se intenta hacer el mismo para checkbox continuación, tratar de usar esto si usarlo

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

Pero no use disable porque siempre desactivar enviar el valor por defecto falso al servidor, ya sea que estaba en marcado o no estado. Y el readonly no funciona para la casilla de verificación y radio button. readonly solo funciona para text campos.

Cuestiones relacionadas