Date uniquement de TextBoxFor ()


272

J'ai du mal à afficher la seule partie date d'un DateTime dans une zone de texte à l'aide de TextBoxFor <,> (expression, htmlAttributes).

Le modèle est basé sur Linq2SQL, le champ est un DateTime sur SQL et dans le modèle Entity.

Échoué:

<%= Html.TextBoxFor(model => model.dtArrivalDate, String.Format("{0:dd/MM/yyyy}", Model.dtArrivalDate))%>

Cette astuce semble être dépréciée, toute valeur de chaîne dans l'objet htmlAttribute est ignorée.

Échoué:

[DisplayFormat( DataFormatString = "{0:dd/MM/yyyy}" )]
public string dtArrivalDate { get; set; }

Je voudrais stocker et afficher uniquement la partie date sur la vue détails / édition, sans la partie "00:00:00".

Réponses:


237
[DisplayName("Start Date")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime StartDate { get; set; }

Ensuite:

<%=Html.EditorFor(m => m.StartDate) %>

Oui, comme il existe maintenant l'assistant EditorFor et que MVC2 est finalisé, votre solution est la voie à suivre
Kronos

66
Mais maintenant, le sélecteur de date Jquery UI ne peut pas être appliqué à cette entrée, car il ignore mes attributs @ class = "datepicker" comme spécifié dans l'assistant Html.EditorFor (). Ainsi, cette zone de texte se formate désormais correctement, mais ne lance pas de sélecteur de date lorsque vous cliquez dessus. Donc, c'est réparé une chose et cassé une autre.
Aaron

5
Comment puis-je le faire s'afficher conformément à cette solution, mais aussi lui faire lancer le sélecteur de date comme il l'a fait avec Html.TextboxFor ()
Aaron

49
J'utilise la syntaxe MVC4 Razor, le champ de date est rendu en tant que @Html.EditorFor(m => m.IssueDate)et la mise en forme sur le modèle est appliquée en tant que [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}" )]mais la date est toujours affichée comme01/01/0001 12:00:00 AM
bjan

4
@Aaron Il n'y a pas de surcharge de EditorFor qui a un paramètre htmlAttributes. Vous le passez probablement dans le paramètre viewTemplate ou quelque chose, pensant que vous passiez htmlAttributes. C'est l'inconvénient de Editorfor. TextBoxFor ignore les annotations DisplayFormat. La solution d'Alexeyss applique le format différemment pour contourner ce problème.
AaronLS

363

MVC4 a résolu ce problème en ajoutant une nouvelle TextBoxForsurcharge, qui prend un paramètre de format de chaîne. Vous pouvez maintenant simplement faire ceci:

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}")

Il y a aussi une surcharge qui prend des attributs html, vous pouvez donc définir la classe CSS, câbler les sélecteurs de date, etc.:

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}", new { @class="input-large" })

40
C'est la meilleure réponse pour MVC4 - cela me permet d'utiliser jquery UI datepicker et formate la sélection en faisant ceci:@Html.TextBoxFor(m => m.SomeDate, "{0:MM/dd/yyyy}", new { @id="datepicker" })
ericb

3
Je vous remercie! Mais il semble qu'un bug que TextBoxFor ignore l' [DisplayFormat]attribut du modèle . Heureux qu'il y ait au moins un remplacement dans TextBoxFor (et que vous m'ayez alerté).
Neil Laslett

7
Je le configure comme ceci @Html.TextBoxFor(model => model.CDate, "{0:dd.MM.yyyy}")mais sur httpPost, j'obtiens des données comme MM.dd.yyyy. Comment résoudre ça?
user007

3
Je t'achète une bière! Ce petit problème m'a causé un tel mal de tête jusqu'à ce que je trouve cette réponse.
JoshYates1980

3
FYI : De nombreux navigateurs et les input[type=date]spécifications nécessitent un "{0:yyyy-MM-dd}"format.
KyleMit

259
<%= Html.TextBoxFor(model => model.EndDate, new { @class = "jquery_datepicker", @Value = Model.EndDate.ToString("dd.MM.yyyy") })%>

5
La solution EditorFor fonctionne, sauf lorsque vous devez remplacer d'autres attributs HTML comme l'id ou la classe. C'est une excellente solution. Étrange que le V doive être en majuscules.
Ben Mills

1
Pour gérer null en toute sécurité, vous pouvez utiliser Model.EndDate.GetValueOrDefault (). ToString ("dd.MM.yyyy"). La valeur par défaut de Datetime sera affichée si Model.EndDate est null.

15
En ce qui concerne les valeurs nulles, la valeur par défaut de DateTime est le 1er janvier 1901, à mon avis, il serait préférable d'utiliser@Value = (Model.DateBecamePermanentResident == null ? "" : Model.DateBecamePermanentResident.Value.ToString("dd.MM.yyyy"))
Serj Sagan

1
@Spikolynn, cela n'a pas généré de deuxième attribut 'Value' pour moi (MVC3 / modèle de rasoir).
Doug S

2
IMORTANT: Vérifiez le "V" majuscule dans "Valeur", une petite lettre ne le fera pas!
Tejasvi Hegde

48

Ou utilisez les aides non typées:

<%= Html.TextBox("StartDate", string.Format("{0:d}", Model.StartDate)) %>

22
Légère variation@Html.TextBoxFor(model => model.EndDate, "{0:d}", new { type = "date" })
Dan Friedman

Il utilise Razor au lieu du moteur de vue ASPX, mais ils fonctionnent tous les deux dans MVC 4 et le passage d'une syntaxe à l'autre est trivial. J'ai posté dans Razor parce que c'est ce que j'ai utilisé et testé avec. Comme je l'ai dit, c'est une variation.
Dan Friedman

1
@ Dan Friedman: C'était la voie à suivre pour moi! J'avais l'habitude de travailler avec un modèle d'éditeur, mais j'ai également dû créer mon propre html et inclure également tous les messages de validation ET tous les attributs Bootstrap, c'est donc vraiment la voie à suivre pour moi (asp.net mvc5)
Michel

1
Pouvez-vous créer un nouveau problème et détailler ce que vous avez fait. Taguez-moi et je serai heureux de vous aider.
Dan Friedman

1
Cette solution est la meilleure lorsque vous avez besoin de mondialisation.
alansiqueira27

26

Cela a fonctionné pour moi.

@Html.TextBoxFor(m => m.DateOfBirth, "{0:MM/dd/yyyy}", new { size = "12", @class = "DOB", tabindex = 121 })

12

N'ayez pas peur d'utiliser du HTML brut.

<input type="text" value="<%= Html.Encode(Model.SomeDate.ToShortDateString()) %>" />

4
Comment le posterait-il à l'époque? Parce que la date ne sera certainement pas analysée sur le serveur.
Robert Koritnik

10
Tant que vous incluez le 'name = "StartDate" approprié, le classeur de modèle le récupérera.
naspinski

@DrJokepu la seule chose que ce travailleur pour moi sur MVC3. Autrement dit, je n'ai pas réussi à créer TextBoxForou à EditorForformater la valeur de toute façon. Voir ma question: l' aide de TextBoxFor mélange le jour et le mois dans les dates
horgh

10

TL; DR;

@Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date")

L'application [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]n'a pas fonctionné pour moi!


Explication:

Afin d'afficher une propriété date de votre modèle à l'aide de Html.TextBoxFor:

entrez la description de l'image ici

Propriété Date de votre classe de modèle:

public DateTime DOB { get; set; }

Rien d'autre n'est nécessaire du côté du modèle.


Dans Razor, vous faites:

@Html.TextBoxFor(m => m.DOB,"{0:yyyy-MM-dd}", new { type = "date")


Explication:

La date d'un inputélément html de type datedoit être formatée par rapport à ISO8601 , qui est:yyyy-MM-dd

La date affichée est formatée en fonction des paramètres régionaux du navigateur de l'utilisateur, mais la valeur analysée est toujours formatée aaaa-mm-jj.

D'après mon expérience, la langue n'est pas déterminée par l'en- Accept-Languagetête, mais par la langue d'affichage du navigateur ou la langue du système d'exploitation.


4

Vous pouvez également utiliser les attributs HTML 5 en appliquant cette annotation de données:

[DataType(DataType.Date)]

Mais le problème est que cela permet un sélecteur de date spécifique au navigateur pour les navigateurs HTML 5. Vous avez toujours besoin de votre propre sélecteur de date pour les navigateurs sans prise en charge, puis vous devez vous assurer que votre sélecteur de date n'apparaît pas en plus d'un navigateur (Modernizr peut le faire facilement), ou masquer le navigateur s'il le fait (compliqué et je Je ne sais pas à quel point les méthodes que j'ai vues étaient fiables).

En fin de compte, je suis allé avec Alex parce que mon environnement actuel n'a pas Modernizr, mais si c'était le cas, je l'aurais utilisé pour afficher conditionnellement mon sélecteur de données uniquement si le navigateur ne le supportait pas déjà.


3

Pour moi, je devais garder le TextboxFor()car l'utilisation EditorFor()change le type d'entrée à ce jour. Ce qui, dans Chrome, ajoute un sélecteur de date intégré, qui a foiré le sélecteur de date jQuery que j'utilisais déjà. Donc, pour continuer à utiliser TextboxFor()ET uniquement pour afficher la date, vous pouvez le faire:

<tr>
    <td class="Label">@Html.LabelFor(model => model.DeliveryDate)</td>
    @{
        string deliveryDate = Model.DeliveryDate.ToShortDateString();
    }
    <td>@Html.TextBoxFor(model => model.DeliveryDate, new { @Value = deliveryDate }) *</td>
    <td style="color: red;">@Html.ValidationMessageFor(model => model.DeliveryDate)</td>
</tr>

1

L'attribut DisplayFormat n'a pas fonctionné pour moi sous aucune forme lors du chargement initial. J'ai plutôt créé un EditorTemplate:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
<%@ Import Namespace="System.Web.Mvc.Html" %>
<%=
    Html.TextBox("", Model.ToShortDateString(), new { @class = "date-range" }) %>

1

L'éditeur de modèles fonctionnera uniquement à des fins d'affichage. Si vous utilisez le même éditeur (ce qui est logique car c'est un éditeur) et que vous avez fourni une valeur comme 31/01/2010 - vous obtiendrez un message d'erreur indiquant que le format n'est pas valide.


1

J'utilise Globalize donc je travaille avec de nombreux formats de date, utilisez donc ce qui suit:

@Html.TextBoxFor(m => m.DateOfBirth, "{0:d}")

Cela ajustera automatiquement le format de la date aux paramètres régionaux du navigateur.


1

Gardez à l'esprit que l'affichage dépendra de la culture. Et bien que dans la plupart des cas, toutes les autres réponses soient correctes, cela n'a pas fonctionné pour moi. Le problème de culture entraînera également différents problèmes avec jQuery datepicker, s'il est joint.

Si vous souhaitez forcer l'échappement du format /de la manière suivante:

@Html.TextBoxFor(model => model.dtArrivalDate, "{0:MM\\/dd\\/yyyy}")

Si ce n'est pas échappé pour moi, cela montre 08-01-2010vs prévu 08/01/2010.

De plus, s'il n'est pas échappé, jQuery datepicker sélectionnera une autre date par défaut, dans mon cas c'était le cas May 10, 2012.


1

Si vous utilisez le sélecteur de date Bootstrap, vous pouvez simplement ajouter l' attribut data_date_format comme ci-dessous.

      @Html.TextBoxFor(m => m.StartDate, new { 
@id = "your-id", @class = "datepicker form-control input-datepicker", placeholder = "dd/mm/yyyy", data_date_format = "dd/mm/yyyy" 
})

0

// la date et l'heure s'affichent dans la datePicker est le 11/24/2011 12:00:00 AM

// vous pouvez diviser cela par espace et définir la valeur à date uniquement

Scénario:

    if ($("#StartDate").val() != '') {
        var arrDate = $('#StartDate').val().split(" ");
        $('#StartDate').val(arrDate[0]);
    }

Balisage:

    <div class="editor-field">
        @Html.LabelFor(model => model.StartDate, "Start Date")
        @Html.TextBoxFor(model => model.StartDate, new { @class = "date-picker-needed" })
    </div>

J'espère que cela aide ..


7
Votre solution devrait fonctionner. Mais à mon humble avis, il peut être dangereux de s'appuyer sur le côté client sur la date de chaîne formatée émise côté serveur. Si les paramètres régionaux côté serveur n'incluent pas d'espace entre la date et l'heure, votre solution exposée échouera.
Kronos

0

Bien sûr, vous pouvez utiliser Html.EditorFor. Mais si vous souhaitez utiliser TextBoxFor et utiliser le format de l'attribut DisplayFormat, vous pouvez l'utiliser de cette manière:

@Html.TextBoxFor(model => model.dtArrivalDate, ModelMetadata.FromLambdaExpression(model => model.dtArrivalDate, ViewData).EditFormatString)

ou créez la prochaine extension:

public static class HtmlExtensions
{
    public static MvcHtmlString TextBoxWithFormatFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        return htmlHelper.TextBoxFor(expression, ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).EditFormatString, htmlAttributes);
    }
}

0

Ajoutez juste à côté de votre modèle.

[DataType(DataType.Date)]
public string dtArrivalDate { get; set; }

0

Lorsque vous utilisez des assistants de balise dans ASP.NET Core, le format doit être spécifié au format ISO. Si elles ne sont pas spécifiées comme telles, les données d'entrée liées ne s'afficheront pas correctement et s'afficheront en mm / jj / aaaa sans valeur.

Modèle:

[Display(Name = "Hire")]
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime? HireDate { get; set; }

Vue:

<input asp-for="Entity.HireDate" class="form-control" />

Le format peut également être spécifié dans la vue à l'aide de l'attribut asp-format.

Le code HTML résultant se présente comme suit:

<input class="form-control" type="date" id="Entity_HireDate" 
    name="Entity.HireDate" value="2012-01-01">

0

Vous pouvez utiliser le code ci-dessous pour imprimer l'heure au format HH: mm . Dans mon cas, le type de propriété est TimeSpan. La valeur vient donc au format HH: mm: tt, mais je dois l'afficher au format ci-dessus. HH: mm

Vous pouvez donc utiliser ce code:

@Html.TextBoxFor(x =>x.mTimeFrom, null, new {@Value =Model.mTimeFrom.ToString().Substring(0,5), @class = "form-control success" })

0

Si vous insistez pour utiliser le [DisplayFormat], mais que vous n'utilisez pas MVC4, vous pouvez utiliser ceci:

@Html.TextBoxFor(m => m.EndDate, new { Value = @Html.DisplayFor(m=>m.EndDate), @class="datepicker" })
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.