textboxfor net mvc htmlattributes asp asp.net-mvc html-helper

asp.net mvc - net - Campo DateTime y ayudante Html.TextBoxFor(). ¿Cómo usarlo correctamente?



html textbox asp net (5)

Tengo un campo DateTime en mi modelo. Si trato de usar este campo en una vista parcial de tipo fuerte de esta manera

<%= Html.TextBoxFor(model => model.DataUdienza.ToString("dd/MM/yyyy"), new { style = "width: 120px" }) %>

Obtendré el siguiente error de compilación en tiempo de ejecución

System.InvalidOperationException : Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.

De todos modos, si lo uso eliminando el formato, ToString ("dd / MM / aaaa") , todo funciona, pero el campo está formateado usando la parte de tiempo que no necesito en absoluto.

¿Dónde estoy haciendo mal? ¿Cuál es la forma correcta de manejar esto?

¡gracias por ayudar!

EDITAR

Esta es la declaración de propiedad en la clase modelo.

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


Al menos si usa la maquinilla de afeitar, puede asignar un nombre a la plantilla, por lo que no necesita usar la misma plantilla para todos los DateTimes:

@Html.EditorFor(m => m.StartDate, "Date")

donde Date.cshtml contiene un TextBoxFor o algún otro editor, como @JungleFreak había explicado:

@model DateTime? @Html.TextBox("", Model.HasValue ? Model.Value.ToShortDateString() : string.Empty, new { data_datepicker = true })


Crea una plantilla de editor llamada DateTime.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime?>" %> <%=Html.TextBox("", (Model.HasValue ? Model.Value.ToString("MM/dd/yyyy") : string.Empty), ViewData) %>

Póngalo en su carpeta Views / Shared / EditorTemplates. Ahora cuando llames:

<%= Html.EditorFor(model => model.DataUdienza) %>

Tu DateTime se formateará sin la hora.

Esto sucederá con todos los DateTimes llamados de esta manera, aunque ...

Los atributos html personalizados se pueden usar de esta manera:

<%= Html.EditorFor(model => model.DataUdienza, new {customAttr = "custom", @class = "class"}) %>

Pasa a través del EditorTemplate como ViewData.


Quizás se podría crear un método de extensión:

public static MvcHtmlString DateTimeFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) { var compilationResult = expression.Compile(); TValue dateValue = compilationResult((TModel)html.ViewDataContainer.ViewData.Model); var body = (MemberExpression)expression.Body; return html.TextBox(body.Member.Name, (Convert.ToDateTime(dateValue)).ToCustomDateFormat(), new { id = body.Member.Name, datepicker = true }); }

el método ToCustomDateFormat podría ser un método de extensión para los tipos de fecha y hora que devuelve el valor de cadena en el formato deseado.

Uso:

@Html.DateTimeFor(x=>x.AnyDateTimeProperty)

Funcionó bien para mí (para las propiedades DateTime y DateTime? ), Aunque no estoy seguro de que compilar la expresión en tiempo de ejecución sea una buena idea.


Yo uso esto en mvc 4. También funciona ~

@Html.TextBoxFor(x => x.DatePurchase, "{0:yyyy-MM-dd}", new { @class = "dateInput", @placeholder = "plz input date" })


<%= Html.EditorFor(model => model.DataUdienza) %>

Y en tu modelo:

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

El inconveniente de EditorFor es que no puede aplicar atributos html personalizados al campo generado. Como alternativa podría usar el ayudante TextBox :

<%= Html.TextBox("DataUdienza", Model.Date.ToString("dd/MM/yyyy"), new { style = "width: 120px" })%>