Data solo da TextBoxFor ()


272

Ho problemi a visualizzare l'unica parte della data di un DateTime in una casella di testo utilizzando TextBoxFor <,> (espressione, htmlAttributes).

Il modello si basa su Linq2SQL, il campo è un DateTime su SQL e nel modello Entity.

non riuscita:

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

Questo trucco sembra essere deprezzato, qualsiasi valore di stringa nell'oggetto htmlAttribute viene ignorato.

non riuscita:

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

Vorrei archiviare e visualizzare solo la parte della data nella vista dettagli / modifica, senza la parte "00:00:00".

Risposte:


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

Poi:

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

Sì, poiché ora c'è l'editor EditorFor e MVC2 è finalizzato, la tua soluzione è la strada da percorrere
Kronos

66
Ma ora il datepicker dell'interfaccia utente di Jquery non può essere applicato a questo input, perché ignora i miei attributi @ class = "datepicker" come specificato nell'helper Html.EditorFor (). Quindi questa casella di testo ora viene formattata correttamente, ma non avvia un datepicker quando si fa clic. Quindi ha risolto una cosa e ne ha rotta un'altra.
Aaron,

5
Come posso farlo visualizzare in linea con questa soluzione, ma anche farlo lanciare il datepicker come ha fatto con Html.TextboxFor ()
Aaron

49
Sto usando la sintassi MVC4 Razor, il campo della data viene visualizzato come @Html.EditorFor(m => m.IssueDate)e la formattazione sul modello viene applicata come [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}" )]ma la data viene ancora mostrata come01/01/0001 12:00:00 AM
bjan

4
@Aaron Non c'è sovraccarico di EditorFor che ha un parametro htmlAttributes. Probabilmente lo stai passando nel parametro viewTemplate o qualcosa del genere, pensando che stavi passando htmlAttributes. Questo è lo svantaggio di Editorfor. TextBoxFor ignora l'annotazione DisplayFormat. La soluzione di Alexeyss applica il formato in modo diverso per aggirare questo problema.
AaronS

363

MVC4 ha risolto questo problema aggiungendo un nuovo TextBoxForsovraccarico, che accetta un parametro di formato stringa. Ora puoi semplicemente fare questo:

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

C'è anche un sovraccarico che accetta gli attributi html, quindi puoi impostare la classe CSS, collegare i datepicker, ecc:

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

40
Questa è la risposta migliore per MVC4 - mi permette di usare jpery UI datepicker e formatta la selezione facendo questo:@Html.TextBoxFor(m => m.SomeDate, "{0:MM/dd/yyyy}", new { @id="datepicker" })
ericb

3
Grazie! Ma sembra un bug che TextBoxFor ignori l' [DisplayFormat]attributo del modello . Sono contento che ci sia almeno una sostituzione in TextBoxFor (e che mi hai avvisato).
Neil Laslett,

7
L'ho impostato in questo modo @Html.TextBoxFor(model => model.CDate, "{0:dd.MM.yyyy}")ma su httpPost ottengo dati come MM.dd.yyyy. Come risolverlo?
user007

3
Ti sto comprando una birra! Questo piccolo problema mi ha causato un tale mal di testa fino a quando non ho trovato questa risposta.
JoshYates1980,

3
Cordiali saluti : molti browser e le input[type=date]specifiche richiedono un "{0:yyyy-MM-dd}"formato.
KyleMit,

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

5
La soluzione EditorFor funziona, tranne quando è necessario sovrascrivere altri attributi HTML come l'id o la classe. Questa è un'ottima soluzione Strano che la V debba essere maiuscola.
Ben Mills,

1
Per gestire null in modo sicuro, è possibile eseguire Model.EndDate.GetValueOrDefault (). ToString ("dd.MM.yyyy"). Il valore predefinito di Datetime verrà visualizzato se Model.EndDate è null.

15
Per quanto riguarda i valori null, il valore predefinito di DateTime è il 1 ° gennaio 1901, a mio avviso, sarebbe meglio usarlo@Value = (Model.DateBecamePermanentResident == null ? "" : Model.DateBecamePermanentResident.Value.ToString("dd.MM.yyyy"))
Serj Sagan

1
@Spikolynn, questo non ha generato un secondo attributo 'Value' per me (MVC3 / modello di rasoio).
Doug S,

2
IMPORTANTE: verifica la "V" maiuscola in "Valore", la lettera minuscola non lo farà!
Tejasvi Hegde,

48

Oppure usa gli helper non tipizzati:

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

22
Leggera variazione@Html.TextBoxFor(model => model.EndDate, "{0:d}", new { type = "date" })
Dan Friedman,

Utilizza Razor invece del motore di visualizzazione ASPX, ma entrambi funzionano in MVC 4 e passare da una sintassi all'altra è banale. Ho pubblicato su Razor perché è quello che ho usato e testato. Come ho detto, è una variazione.
Dan Friedman,

1
@Dan Friedman: questa era la strada da percorrere per me! Lavoravo con un modello di editor, ma poi dovevo anche creare il mio codice HTML e includere anche tutti i messaggi di convalida E tutti gli attributi Bootstrap, quindi questa è davvero la strada da percorrere per me (asp.net mvc5)
Michel

1
Puoi creare un nuovo problema e dettagliare quello che hai fatto. Taggami e sarò felice di aiutarti.
Dan Friedman,

1
Questa soluzione è la migliore quando è necessaria la globalizzazione.
alansiqueira27,

26

Questo ha funzionato per me.

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

12

Non aver paura di usare HTML non elaborato.

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

4
Come lo avrebbe pubblicato allora? Perché la data quasi sicuramente non verrà analizzata nuovamente sul server.
Robert Koritnik,

10
Finché includi il nome 'name = "StartDate"' corretto, il raccoglitore del modello lo prenderà.
naspinski,

@DrJokepu l'unica cosa che il lavoratore per me su MVC3. Cioè non sono riuscito a creare TextBoxForo EditorForformattare il valore comunque. Vedi la mia domanda: TextBoxPer l'helper mescola giorno e mese in date
horgh,

10

TL; DR;

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

L'applicazione [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]non ha funzionato per me!


Spiegazione:

Per visualizzare una proprietà data del modello usando Html.TextBoxFor:

inserisci qui la descrizione dell'immagine

Proprietà Date della classe del modello:

public DateTime DOB { get; set; }

Nient'altro è necessario dal lato del modello.


In Razor fai:

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


Spiegazione:

La data di un inputelemento html di tipo datedeve essere formattata secondo ISO8601 , che è:yyyy-MM-dd

La data visualizzata è formattata in base alle impostazioni internazionali del browser dell'utente, ma il valore analizzato è sempre formattato aaaa-mm-gg.

La mia esperienza è che la lingua non è determinata dall'intestazione Accept-Language, ma dalla lingua di visualizzazione del browser o dalla lingua del sistema operativo.


4

Puoi anche utilizzare gli attributi HTML 5 applicando questa annotazione di dati:

[DataType(DataType.Date)]

Ma il problema è che abilita un selettore di date specifico del browser per i browser HTML 5. Hai ancora bisogno del tuo selettore di date per i browser senza supporto, quindi devi assicurarti che il tuo selettore di date non appaia in aggiunta a un browser (Modernizr può farlo facilmente), o nascondi il browser se lo fa (complicato e io non so quanto fossero affidabili i metodi che ho visto).

Alla fine sono andato con Alex perché il mio ambiente attuale non ha Modernizr, ma se lo avesse fatto, lo avrei usato per mostrare in modo condizionale il mio selettore di dati solo se il browser non ne supportava già uno.


3

Per quanto mi riguarda, ho dovuto mantenere il TextboxFor()perché l'utilizzo EditorFor()modifica il tipo di input fino ad oggi. Che, in Chrome, aggiunge un selettore di date incorporato, che ha rovinato il datepicker jQuery che stavo già utilizzando. Quindi, per continuare a utilizzare TextboxFor()AND solo l'output della data, puoi farlo:

<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'attributo DisplayFormat non ha funzionato per me in nessuna delle due forme al caricamento iniziale. Ho invece creato 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'editor dei modelli funzionerà solo a scopo di visualizzazione. Se usi lo stesso editor (il che ha senso perché è un editor) e hai fornito un valore come 31/01/2010 - riceverai un messaggio di errore che dice che il formato non è valido.


1

Uso Globalize, quindi lavoro con molti formati di data, quindi uso quanto segue:

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

Ciò adeguerà automaticamente il formato della data alle impostazioni internazionali del browser.


1

Tieni presente che la visualizzazione dipenderà dalla cultura. E mentre nella maggior parte dei casi tutte le altre risposte sono corrette, non ha funzionato per me. Il problema relativo alla cultura causerà anche diversi problemi con jQuery datepicker, se allegato.

Se si desidera forzare l'uscita del formato /nel modo seguente:

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

Se non è scappato per me, mostra 08-01-2010contro previsto 08/01/2010.

Inoltre, se non è sfuggito jpery datepicker selezionerà data di default diversa, nel mio caso lo era May 10, 2012.


1

Se stai utilizzando il selettore di date Bootstrap, puoi semplicemente aggiungere l' attributo data_date_format come di seguito.

      @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

// datimetime viene visualizzato in datePicker è il 24/11/2011 alle 12:00:00

// puoi dividerlo per spazio e impostare il valore solo per data

script:

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

markup:

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

Spero che questo aiuti ...


7
La tua soluzione dovrebbe funzionare. Ma a mio modesto parere, può essere pericoloso fare affidamento sul lato client alla data della stringa formattata emessa sul lato server. Se le impostazioni internazionali sul lato server non includono uno spazio tra data e ora, la soluzione esposta non funzionerà.
Kronos,

0

Sicuro che puoi usare Html.EditorFor. Ma se vuoi usare TextBoxFor e utilizzare il formato dall'attributo DisplayFormat puoi usarlo in questo modo:

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

o crea la prossima estensione:

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

Aggiungi solo accanto al tuo modello.

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

0

Quando si utilizzano gli helper di tag in ASP.NET Core, il formato deve essere specificato in formato ISO. Se non specificato come tale, i dati di input associati non verranno visualizzati correttamente e verranno visualizzati come mm / gg / aaaa senza valore.

Modello:

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

Visualizza:

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

Il formato può anche essere specificato nella vista usando l'attributo asp-format.

L'HTML risultante avrà il seguente aspetto:

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

0

Puoi usare il codice qui sotto per stampare il tempo nel formato HH: mm , Nel mio caso il tipo di proprietà è TimeSpan Quindi il valore sta arrivando nel formato HH: mm: tt ma devo mostrarlo nel formato sopra cioè. HH: mm

Quindi puoi usare questo codice:

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

0

Se insisti nell'usare il [DisplayFormat], ma non stai usando MVC4, puoi usare questo:

@Html.TextBoxFor(m => m.EndDate, new { Value = @Html.DisplayFor(m=>m.EndDate), @class="datepicker" })
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.