asp.net mvc 3 - disabled - MVC3 EditorFor readOnly
editorfor readonly mvc 5 (11)
Así es como lo hago:
Modelo:
[ReadOnly(true)]
public string Email { get { return DbUser.Email; } }
Ver:
@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 muchas cosas más, como agregar una etiqueta, agregar una clase requerida a esa etiqueta según sea necesario, agregar DisplayFor
si la propiedad es ReadOnly
EditorFor
si no es así, agregar ValidateMessageFor
y finalmente envolver todo eso en una Div
que puede tener Html Attributes
asignados ... mis Views
son súper limpias.
Quiero hacer solo readOnly con EditorFor en la página de edición.
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 la edición de este campo?
Gracias.
Cree un EditorTemplate para un conjunto específico de Vistas (vinculado por un Controlador):
En este ejemplo, tengo una plantilla para una Fecha, pero puedes cambiarla a lo que quieras.
Aquí está el código en el Data.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; }
Creo que esto es simple que otros usando el atributo [Editable (false)]
por ejemplo:
public class MyModel
{
[Editable(false)]
public string userName { get; set; }
}
El Editor para html helper no tiene sobrecargas que toman atributos HTML. En este caso, debe 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 puede usar EditorFor, pero necesitará tener un TextBoxFor en un EditorTemplate personalizado:
public class MyModel
{
[UIHint("userName")]
public string userName { ;get; set; }
}
Luego, en su carpeta Views / Shared / EditorTemplates, cree un archivo userName.cshtml. En ese archivo, pon esto:
@model string
@Html.TextBoxFor(m => m, new { disabled = "disabled", @readonly = "readonly" })
Este código es compatible con MVC4 en adelante
@Html.EditorFor(model => model.userName, new { htmlAttributes = new { @class = "form-control", disabled = "disabled", @readonly = "readonly" } })
Intenta usar:
@Html.DisplayFor(model => model.userName) <br/>
@Html.HiddenFor(model => model.userName)
Para aquellos que se preguntan por qué quieres usar un EditoFor si no quieres que se pueda editar, 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 quiera mostrar ese formato, la única forma en que funciona es con un editor para, pero tengo un jquery datepicker para esa "entrada", por lo que tiene que ser de solo lectura para evitar que los usuarios escriban fechas incorrectas.
Para que funcione de la manera que quiero, puse esto en la Vista ...
@Html.EditorFor(m => m.issueDate, new{ @class="inp", @style="width:200px", @MaxLength = "200"})
y esto en mi función de listo ...
$(''#issueDate'').prop(''readOnly'', true);
Espero que esto sea útil para alguien allá afuera. Lo siento por mi ingles
Publicación anterior que sé ... pero ahora puedes hacer esto para mantener la alineación y que todo parezca consistente ...
@Html.EditorFor(model => model.myField, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
Puedes hacerlo de esta manera:
@Html.EditorFor(m => m.userName, new { htmlAttributes = new { disabled = true } })
Sé que la pregunta dice MVC 3, pero fue en 2012, por si acaso:
A partir de MVC 5.1 ahora puede pasar atributos HTML a EditorFor
así:
@Html.EditorFor(x => x.Name, new { htmlAttributes = new { @readonly = "", disabled = "" } })
<div class="editor-field">
@Html.EditorFor(model => model.userName)
</div>
Use jquery para deshabilitar
<script type="text/javascript">
$(document).ready(function () {
$(''#userName'').attr(''disabled'', true);
});
</script>