web-dev-qa-db-fra.com

Champ DateTime et assistant Html.TextBoxFor (). Comment l'utiliser correctement?

J'ai un champ DateTime dans mon modèle. Si j'essaie d'utiliser ce champ dans une vue partielle typée forte de cette façon

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

J'obtiendrai l'erreur de compilation suivante lors de l'exécution

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

Quoi qu'il en soit, si je l'utilise en supprimant la mise en forme, ToString ("jj/MM/aaaa"), tout fonctionne mais le champ est formaté en utilisant la partie horaire dont je n'ai pas besoin du tout.

Où je me trompe? Quelle est la bonne façon de gérer cela?

merci pour ton aide!

MODIFIER

Il s'agit de la déclaration de propriété dans la classe de modèle

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

Créez un modèle d'éditeur appelé 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) %>

Mettez-le dans votre dossier Views/Shared/EditorTemplates. Maintenant, lorsque vous appelez:

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

Votre DateTime sera formaté sans l'heure.

Cela se produira avec tous les DateTimes appelés de cette façon, cependant ...

Les attributs html personnalisés peuvent être utilisés de cette manière:

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

Il passe à EditorTemplate en tant que ViewData.

12
Rohrbs

j'utilise ceci dans mvc 4. ça marche aussi ~

@Html.TextBoxFor(x => x.DatePurchase, "{0:yyyy-MM-dd}", new { @class = "dateInput", @placeholder = "plz input date" })
23
DarkMFJ
<%= Html.EditorFor(model => model.DataUdienza) %>

Et dans votre modèle:

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

L'inconvénient de EditorFor est que vous ne pouvez pas appliquer d'attributs html personnalisés au champ généré. Comme alternative, vous pouvez utiliser l’assistant TextBox:

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

Au moins si vous utilisez un rasoir, vous pouvez nommer le modèle, vous n'avez donc pas besoin d'utiliser le même modèle pour tous les DateTimes:

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

où Date.cshtml contient un TextBoxFor ou un autre éditeur, comme @JungleFreak l'avait expliqué:

@model DateTime?

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

Peut-être qu'une méthode d'extension pourrait être créée:

    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 méthode ToCustomDateFormat pourrait être une méthode d'extension pour les types dateTime qui renvoie la valeur de chaîne au format souhaité.

Usage:

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

A bien fonctionné pour moi (pour DateTime et DateTime? propriétés), même si je ne sais pas si la compilation de l'expression au moment de l'exécution est une bonne idée.

1
bussa