Editor MVC3 para solo lectura


Quiero hacer readOnly con EditorFor en edit page.

Traté de poner readonly y disabled como:

<div class="editor-field">
        @Html.EditorFor(model => model.userName, new { disabled = "disabled", @readonly = "readonly" })
    </div>

Sin Embargo, no funciona. ¿Cómo puedo hacer para desactivar editar este campo?

Gracias.

Author: wholee1, 2012-04-11

11 answers

El ayudante EditorFor html no tiene sobrecargas que tomen atributos HTML. En este caso, necesitas usar algo más específico como TextBoxFor:

<div class="editor-field">
    @Html.TextBoxFor(model => model.userName, new 
        { disabled = "disabled", @readonly = "readonly" })
</div>

Todavía puedes usar EditorFor, pero necesitarás tener un TextBoxFor en una plantilla EditorTemplate personalizada:

public class MyModel
{
    [UIHint("userName")]
    public string userName { ;get; set; }
}

Luego, en su carpeta Views/Shared/EditorTemplates, cree un nombre de usuario de archivo.cshtml. En ese archivo, ponga esto:

@model string
@Html.TextBoxFor(m => m, new { disabled = "disabled", @readonly = "readonly" })
 79
Author: danludwig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-19 18:20:20

Este código es compatible con MVC4 en adelante

@Html.EditorFor(model => model.userName, new { htmlAttributes = new { @class = "form-control", disabled = "disabled", @readonly = "readonly" } })
 24
Author: GSoft Consulting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-18 10:14:24

Para aquellos que se preguntan por qué quieres usar un EditoFor si no quieres que sea editable, tengo un ejemplo.

Tengo esto en mi Modelo.

    [DataType(DataType.Date)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0: dd/MM/yyyy}")]
    public DateTime issueDate { get; set; }

Y cuando se desea mostrar ese formato, la única forma en que funciona es con un EditorFor, pero tengo un datepicker de jquery para esa "entrada", por lo que tiene que ser leído solo para evitar que los usuarios escriban fechas incorrectas.

Para que funcione de la manera que quiero pongo esto en la vista...

     @Html.EditorFor(m => m.issueDate, new{ @class="inp", @style="width:200px", @MaxLength = "200"})

Y esto en mi lista función...

     $('#issueDate').prop('readOnly', true);

Espero que esto sea útil para alguien por ahí. Lo siento por mi inglés

 12
Author: Seichi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-17 16:14:19

Puedes hacerlo de esta manera:

@Html.EditorFor(m => m.userName, new { htmlAttributes = new { disabled = true } })
 5
Author: Francois,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-31 07:02:21

Así es como lo hago:

Modelo:

[ReadOnly(true)]
public string Email { get { return DbUser.Email; } }

Vista:

@Html.TheEditorFor(x => x.Email)

Extensión:

namespace System.Web.Mvc
{
    public static class CustomExtensions
    {
        public static MvcHtmlString TheEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null)
        {
            return iEREditorForInternal(htmlHelper, expression, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
        }

        private static MvcHtmlString iEREditorForInternal<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
        {
            if (htmlAttributes == null) htmlAttributes = new Dictionary<string, object>();

            TagBuilder builder = new TagBuilder("div");
            builder.MergeAttributes(htmlAttributes);

            var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);


            string labelHtml = labelHtml = Html.LabelExtensions.LabelFor(htmlHelper, expression).ToHtmlString();

            if (metadata.IsRequired)
                labelHtml = Html.LabelExtensions.LabelFor(htmlHelper, expression, new { @class = "required" }).ToHtmlString();


            string editorHtml = Html.EditorExtensions.EditorFor(htmlHelper, expression).ToHtmlString();

            if (metadata.IsReadOnly)
                editorHtml = Html.DisplayExtensions.DisplayFor(htmlHelper, expression).ToHtmlString();


            string validationHtml = Html.ValidationExtensions.ValidationMessageFor(htmlHelper, expression).ToHtmlString();

            builder.InnerHtml = labelHtml + editorHtml + validationHtml;

            return new MvcHtmlString(builder.ToString(TagRenderMode.Normal));
        }
    }
}

Por supuesto, mi editor está haciendo un montón de cosas más, como agregar una etiqueta, agregar una clase requerida a esa etiqueta según sea necesario, agregar un DisplayFor si la propiedad es ReadOnly EditorFor si no es así, agregar un ValidateMessageFor y finalmente envolver todo eso en un Div que puede tener Html Attributes asignado... mis Views están súper limpios.

 3
Author: Serj Sagan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-04 23:45:08

Sé que la pregunta dice MVC 3, pero era 2012, así que por si acaso:

A partir de MVC 5.1 ahora puede pasar atributos HTML a EditorFor de la siguiente manera:

@Html.EditorFor(x => x.Name, new { htmlAttributes = new { @readonly = "", disabled = "" } })
 3
Author: stovroz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-13 23:35:39

Intenta usar:

@Html.DisplayFor(model => model.userName) <br/>
@Html.HiddenFor(model => model.userName)
 3
Author: Mohamed Ashraf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-04 12:11:59

Crear una EditorTemplate para un conjunto específico de vistas (enlazadas por un Controlador): introduzca la descripción de la imagen aquí

En este ejemplo tengo una plantilla para una Fecha, pero puedes cambiarla a lo que quieras.

Aquí está el código en los Datos.cshtml:

@model Nullable<DateTime>

@Html.TextBox("", @Model != null ? String.Format("{0:d}",     ((System.DateTime)Model).ToShortDateString()) : "", new { @class = "datefield", type =    "date", disabled = "disabled"  @readonly = "readonly" }) 

Y en el modelo:

[DataType(DataType.Date)]
public DateTime? BlahDate { get; set; }
 1
Author: DaniilZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-05 17:12:27

Viejo post que conozco.. pero ahora usted puede hacer esto para mantener la alineación y todos buscando consistente..

 @Html.EditorFor(model => model.myField, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
 1
Author: da_jokker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-05 16:11:20

Creo que esto es más simple que otro mediante el uso de [Editable(false)] atributo

Por ejemplo:

 public class MyModel
    {
        [Editable(false)]
        public string userName { get; set; }
    }
 -1
Author: MaTya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-17 09:13:44
<div class="editor-field">
        @Html.EditorFor(model => model.userName)
</div>

Utilice jquery para desactivar

<script type="text/javascript">
   $(document).ready(function () {
      $('#userName').attr('disabled', true);
     });
</script>
 -1
Author: Luís Ponciano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-20 19:32:42