Tengo un campo DateTime en mi Modelo. Si intento utilizar este campo en un fuerte escribió vista parcial de esta manera

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

Obtengo 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/yyyy»), todo funciona, pero el campo es el formato con el momento en que la parte que no necesito en absoluto.

Donde estoy haciendo mal? Cual es la forma correcta de manejar esto?

gracias por la ayuda!

EDITAR

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

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

5 Comentarios

  1. 12

    Crear un editor de plantilla que se llama 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) %>

    Poner en tu Views/Shared/EditorTemplates carpeta. Ahora, cuando usted llame a:

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

    Su DateTime será formateado sin el tiempo.

    Esto sucederá con todos los DateTimes llamado de esta manera, aunque…

    Html personalizado atributos pueden ser utilizados en esta manera:

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

    Pasa a la EditorTemplate como ViewData.

  2. 23

    yo uso esta en mvc 4. también funciona~

    @Html.TextBoxFor(x => x.DatePurchase, "{0:yyyy-MM-dd}", new { @class = "dateInput", @placeholder = "plz input date" })
    • Gracias muy bonito solución. pero realmente necesito para ver por qué no ha utilizado la cultura de la información de la configuración especificada en la configuración web.
    • Esto hizo que el trabajo para mí, gracias!
  3. 19
    <%= Html.EditorFor(model => model.DataUdienza) %>

    Y en su modelo:

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

    El inconveniente con EditorFor es que no se puede personalizar los atributos de html para generar el campo. Como alternativa, también puede utilizar el TextBox helper:

    <%= Html.TextBox("DataUdienza", Model.Date.ToString("dd/MM/yyyy"), new { style = "width: 120px" })%>
    • Wow! Superfast. Gracias 🙂 voy a probarlo. Pero, mientras tanto, ¿cómo funciona esto, si el campo es un tipo que acepta valores null?
    • Funciona de la misma para tipos que aceptan valores null.
    • Me han tratado de aplicar la solución, pero lamentablemente no funciona. Voy a editar el post para agregar el modelo de declaración de propiedad para su información.
    • ¿se nota que Html.EditorFor debe ser utilizado en lugar de Html.TextBoxFor?
    • Nunca he usado la EditorFor antes. De todos modos ten en cuenta que los dos atributos (Tipo de datos y DisplayFormat) se han añadido ahora para probar tu sugerencia.
    • Gracias por esto, estoy usando el cuadro de texto helper porque necesitaba el campo para ser readonly así que tengo que pasar de nuevo {@readonly=»readonly»} Gracias

  4. 2

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

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

    donde la Fecha.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 })
  5. 1

    Tal vez un método de extensión podría ser creado:

        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 dateTime tipo que devuelve la cadena de valor en el formato deseado.

    Uso:

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

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

Dejar respuesta

Please enter your comment!
Please enter your name here