2010-09-17 16 views
21

Tengo un campo DateTime en mi modelo. Si trato de utilizar este campo en una fuerte visión parcial mecanografiada esta maneracampo DateTime y Html.TextBoxFor() helper. ¿Cómo usarlo correctamente?

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

voy a tener 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 eliminar el formato, ToString ("dd/MM/aaaa"), todo funciona pero el campo está formateado utilizando la parte de tiempo que no necesito en absoluto.

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

gracias por ayudar!

EDITAR

Esta es la declaración de propiedad de la clase del modelo

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

Respuesta

12

crear una plantilla de editor de 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) %> 

ponerlo en su carpeta compartida/Vistas/EditorTemplates. Ahora cuando llame:

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

Su DateTime se dará formato, sin el tiempo.

Esto ocurrirá con todos DateTime llamados de esta manera, aunque ...

personalizada atributos HTML se pueden utilizar de esta manera:

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

Pasa a través de la EditorTemplate como ViewData.

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

Y en su modelo:

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

El dr Una sorpresa con EditorFor es que no puede aplicar atributos html personalizados al campo generado. Como alternativa se puede utilizar el TextBox ayudante:

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

¡Guau! Súper rápido. Gracias :) Voy a intentarlo. Pero, mientras tanto, ¿cómo funciona esto si el campo es de tipo Nullable? – Lorenzo

+0

Funciona igual para tipos anulables. –

+0

He intentado aplicar su solución pero desafortunadamente no funciona. Voy a editar la publicación para agregar la declaración de propiedad del modelo para su información. – Lorenzo

20

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" }) 
+1

Gracias, muy buena solución. pero realmente necesito ver por qué no ha utilizado la información cultural de la configuración especificada en la configuración web. – Desmond

+0

¡Esto hizo el trabajo para mí, gracias! –

2

Al menos si el uso de la maquinilla de afeitar, puede nombrar a la plantilla, por lo que no es necesario utilizar la misma plantilla para todos los DateTime:

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

donde Fecha.cshtml contiene una TextBoxFor o algún otro editor, como @JungleFreak habían explicado:

@model DateTime? 

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

Tal vez un método de extensión se podría crear:

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 }); 
    } 

la ToCustomDateFormat método podría ser un método de extensión para este tipo dateTime que devuelve valor de cadena en el formato deseado.

Uso:

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

funcionó bien para mí (por DateTime y DateTime? propiedades), aunque no estoy seguro de si la compilación de la expresión en el tiempo de ejecución es una buena idea.

Cuestiones relacionadas