348 messaggi dal 10 marzo 2013
Buongiorno a tutti.

Ho un problema per quanto riguarda le date.
Nell'appilcazione che ho sviluppato, ho impostato nel Web.config in modo che il formatto data venisse riconosciuto in tutto il mondo.
Ma due utenti hanno avuto problemi ad inserire le date dai loro computer con S.O. in lingua inglese.
LA domanda e': avete mai avuto a che fare con questo tipo di problematica? mi sapete suggerire una soluzione?

Grazie a tutti e buon FERRAGOSTO
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Mario, buon ferragosto anche a te!

Oiram ha scritto:

ho impostato nel Web.config in modo che il formatto data venisse riconosciuto in tutto il mondo.

Indica l'esatta configurazione che hai inserito nel web.config a tal proposito.
Potresti impostare il nodo globalization in questo modo:
<globalization culture="auto" uiCulture="auto" />

Così che la Culture, ovvero il set di impostazioni che riguardano la lingua e la formattazione dei dati, riflettano quelli preferiti dall'utente.
Questo significa che se l'utente ha un browser in inglese (statunitense), il browser stesso comunicherà questa preferenza al server nella forma di un'intestazione Accept-Language che viene inclusa in ogni richiesta web.
ASP.NET raccoglierà quel valore e imposterà la Culture di conseguenza, grazie all'impostazione del web.config che vedevamo prima.
Questo significa che se uno statunitese usa la tua applicazione, la funzione DateTime.Parse() lavorerà con la rispettiva Culture, e il formato della data verrà interpretato come mm/gg/aaaa.
Con gli utenti italiani, invece, DateTime.Parse() interpreterà le date come gg/mm/aaaa perché per loro è stata impostata la Culture italiana.
In sintesi: ciascun utente potrà inserire le date nel formato che gli è convenzionale senza che tu debba prevedere ogni singolo caso.

Quindi, dato che DateTime.Parse ha questa versatilità, dovresti usarlo per interpretare l'input dell'utente prima di usare la data in una query SQL.
Supponendo che tu sia usando ASP.NET WebForms e una apposita TextBox per la data:
var data = DateTime.Parse(dataInizio.Text);
//ora uso la data come valore di un parametro di un SqlCommand
command.Parameters.AddWithValue("@dataInizio", data);
//eseguo il comando nel database
command.ExecuteNonQuery();


Con questo codice non devi più preoccuparti di sapere in che formato ti arrivano le date. Ci pensa dapprima DateTime.Parse, quando è il momento di interpretare l'input dell'utente. E poi ci pensa il SqlParameter quando invece si tratta di riconvertire quella data in una stringa che abbia significato per il motore database.

ciao,
Moreno

Enjoy learning and just keep making
348 messaggi dal 10 marzo 2013
Ciao Moreno

Il mio Web.Config è il seguente:

<configuration>
<appSettings>
<add key="ValidationSettings:UnobtrusiveValidationMode" value="none" />
</appSettings>
<connectionStrings>
<add name="EsaWebConnectionString" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=EsaWeb;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<globalization culture="auto" uiCulture="auto" />
<compilation debug="true" strict="false" explicit="true" targetFramework="4.5">
<assemblies>
<add assembly="System.Data.Services.Client, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
<add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
<add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
</assemblies>
</compilation>
<httpRuntime targetFramework="4.5" />
<machineKey validationKey="DC7C0A89A1CD77285D21F3C376B234984B32808FB8F2EABCA6E5F732E1F433C6AD83882E18E7A8641411A449DBF3238E35FB3BC9080371613B4AC017B18ECC70" decryptionKey="0B9CFFB34B43077B8C787696ED49C7EE89E81129F32F11C5F4E7D11DD91ED3D8" validation="SHA1" decryption="AES" />
<customErrors mode="Off">
</customErrors>
</system.web>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="itextsharp" publicKeyToken="8354ae6d2174ddca" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

Mentre il codice che uso per scrivere le date è il seguente.
Il web.config è stato modificato secondo le tue indicazioni mentre il codice ancora no.
Volevo chiederti se cosi come l'ho impostato io poteva andare bene lo stesso:


ASPX :

<td class="auto-style34"><asp:TextBox ID="txtCertDate" runat="server" Width="80px" style="margin-left: 3px" BorderColor="Red" ToolTip="Data consegna brevetto"></asp:TextBox>
<asp:RequiredFieldValidator ID="ReqCertDate" runat="server" ControlToValidate="txtCertDate" ErrorMessage="the certification date field is required/il campo data certificazione è obbligatorio" Display="None" />
<asp:CompareValidator ID="ComValDataCert" runat="server" ControlToValidate="txtCertDate" Operator="DataTypeCheck" Type="Date" Display="None" />
<asp:CalendarExtender ID="txtCertDate_CalendarExtender" runat="server" Enabled="True" TargetControlID="txtCertDate" Format="dd/MM/yyyy">
</asp:CalendarExtender>
</td>


VB:

cmdIns.Parameters.Add("@P_DataConsegnaBrev", SqlDbType.Date).Value = txtCertDate.Text
If TxtRinnCert.Text = "" Then
cmdIns.Parameters.Add("P_DataRinnovoBrev", SqlDbType.Date).Value = DBNull.Value
Else
cmdIns.Parameters.Add("P_DataRinnovoBrev", SqlDbType.Date).Value = TxtRinnCert.Text
End If


Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Mario,

Oiram ha scritto:

cmdIns.Parameters.Add("@P_DataConsegnaBrev", SqlDbType.Date).Value = txtCertDate.Text

In questa riga assegni direttamente il valore digitato dall'utente al valore del parametro. Non sono affatto sicuro che il SqlParameter vada ad interpretare l'input secondo la Culture dell'utente (ma puoi fare qualche esperimento per confermare/smentire questa tesi).

Il mio consiglio è che dovresti usare DateTime.Parse per ottenere un valore DateTime dall'input dell'utente, prima di assegnarlo al parametro. In questo modo, grazie al debugger, puoi facilmente verificare che il DateTime.Parse abbia prodotto una data coerente con quella intesa dall'utente.
Se usi DateTime.TryParse, potrai anche verificare che la data sia sintatticamente valida senza che la pagina vada in errore.

Inoltre, l'attributo Format del CalendarExtender così com'è non adatto. Al momento è settato su dd/MM/yyyy, ma per gli utenti inglesi questo formato non va bene.
Per il momento prova semplicemente a togliere l'attributo Format.
Sullo script manager, aggiungi EnableScriptGlobalization="True" e vedi come si comporta.

Puoi facilmente simulare un utente americano cambiando l'intestazione Accept-Language del tuo browser. Per esempio, con Firefox puoi usare questa estensione.
https://addons.mozilla.org/it/firefox/addon/quick-accept-language-switc/

ciao,
Moreno
Modificato da BrightSoul il 21 agosto 2015 17.17 -

Enjoy learning and just keep making
348 messaggi dal 10 marzo 2013
Ciao Moreno

Ancora dopo mesi sono fermo sul gap della data S.O. inglese.

Proprio non riesco a risolvere, per quantoriguarda la scrittura OK nessun problema ma nella pagina che ti sto perpostare proprio non c'è verso.
Ti chiedo un aiuto grazie.

<%@ Page Title="" Language="VB" MasterPageFile="~/SuperAdmin/MasterPage.master" EnableEventValidation="false" AutoEventWireup="false" CodeFile="BrevettiConsegnatiGenPro.aspx.vb" Inherits="SuperAdmin_BrevettiIstruttoriPro" %>

<%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="asp" %>

<asp:Content ID="Content1" runat="server" contentplaceholderid="immagine">
<script>
EnableScriptGlobalization = "True"
</script>
<table class="auto-style26">
<tr>
<td class="auto-style27">
<strong>Record:</strong><asp:Label ID="LblRecord" runat="server"></asp:Label>
&nbsp;
<br />
Data Da: <asp:TextBox ID="TxtDataDa" runat="server"></asp:TextBox>
A: <asp:TextBox ID="TxtDataA" runat="server"></asp:TextBox>
<asp:CalendarExtender ID="TxtDataDa_Calendar" runat="server" Enabled="True" TargetControlID="TxtDataDa" >
</asp:CalendarExtender>
<asp:CalendarExtender ID="TxtDataA_Calendar" runat="server" Enabled="True" TargetControlID="TxtDataA" >
</asp:CalendarExtender>
<asp:Button ID="BtnSearch" runat="server" Text="CERCA" CausesValidation="false" CommandArgument ="" />
<asp:Button ID="BtnReset" runat="server" Text="RESET" />
<asp:imageButton ID="BtnExcel" runat="server" ImageUrl="~/Immagini/Microsoft-Excel-icon.png" BackColor="White" BorderColor="Black" BorderStyle="None" BorderWidth="1px" CausesValidation="False" style="text-align: center" Visible="false" />


<asp:Label ID="LblExcel" runat="server" Text="EXPORT EXCEL" Visible="false"></asp:Label>
</td>
</tr>
</table>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="BrevettiConsPro" PageSize="9999">
<Columns>
<asp:BoundField DataField="P_Cognome" HeaderText="SURNAME" SortExpression="P_Cognome" />
<asp:BoundField DataField="P_Nome" HeaderText="NAME" SortExpression="P_Nome" />
<asp:BoundField DataField="CertTrainer" HeaderText="CERTIFICATION" SortExpression="CertTrainer" />
<asp:BoundField DataField="Specialità" HeaderText="SPECIALITY" SortExpression="Specialità" />
<asp:TemplateField HeaderText="TRAINER" SortExpression="SurnameTra">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("SurnameTra") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("SurnameTra") %>'></asp:Label>
<br />
<asp:Label ID="Label2" runat="server" Text='<%# Bind("NameTra")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="NameTra" HeaderText="NameTra" SortExpression="NameTra" Visible="False" />
<asp:BoundField DataField="Sigla" HeaderText="ACRONYM" SortExpression="Sigla" />
<asp:BoundField DataField="DataConvalida" HeaderText="VALIDATION DATE" SortExpression="DataConvalida" DataFormatString="{0:d}" />
</Columns>
<HeaderStyle BackColor="Blue" ForeColor="White" />
</asp:GridView>
<asp:SqlDataSource ID="BrevettiConsPro" runat="server" ConnectionString="<%$ ConnectionStrings:EsaWebConnectionString %>"
SelectCommand="SELECT [P_Cognome], [P_Nome], [Specialità], [SurnameTra], [NameTra], [Sigla], [DataConvalida], [CertTrainer]
FROM [V_BrevettiConsegnatiPro] WHERE [DataConvalida] BETWEEN @DataCertificazione_Da AND @DataCertificazione_A ORDER BY [DataConvalida]">
<SelectParameters>
<asp:ControlParameter ControlID="TxtDataDa" Name="DataCertificazione_Da" PropertyName="Text" Type="DateTime" />
<asp:ControlParameter ControlID="TxtDataA" Name="DataCertificazione_A" PropertyName="Text" Type="DateTime" />
</SelectParameters>
</asp:SqlDataSource>
<br />
<table align="center" class="auto-style13">
<tr>
<td align ="center">


<br />


<br />
</td>
</tr>
</table>



</asp:Content>


VB Net

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim I As New Class1
Dim pagina As String = I.Control(pagina:=1)

If Not String.IsNullOrEmpty(TxtDataDa.Text) And Not String.IsNullOrEmpty(TxtDataA.Text) Then
Dim cmd As New SqlCommand("SELECT Count (*) FROM [V_BrevettiConsegnatiPro] WHERE [DataConvalida] BETWEEN @DataCertificazione_Da AND @DataCertificazione_A", conn)
cmd.Parameters.AddWithValue("@DataCertificazione_Da", SqlDbType.Date).Value = CDate(TxtDataDa.Text)
cmd.Parameters.AddWithValue("@DataCertificazione_A", SqlDbType.Date).Value = CDate(TxtDataA.Text)
conn.Open()
LblRecord.Text = cmd.ExecuteScalar
conn.Close()
Else
LblRecord.Text = ""
End If

End Sub

Il problema risiede proprio nella pagina VB , anche con il parse non itepreta la data. ho seguito i tuoi consigli sul cambio della lingua per poter testare meglio, e li ho gli errori. Il parse da questo form l'ho rimosso per poter far funzionare la pagina almeno in italiano.

Grazie 1000
Modificato da Oiram il 07 dicembre 2015 10.38 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Mario,

Oiram ha scritto:

<script>
EnableScriptGlobalization = "True"
</script>

Questo pezzo non serve. Probabilmente mi ero spiegato male la volta scorsa.

Ho fatto dei test in locale riducendo il problema all'osso e sono riuscito a farlo funzionare. Ti invio un progetto di esempio.
http://1drv.ms/1lLPRpx

Nei file che troverai nello zip vai a guardare semplicemente:
  • Default.aspx, dove ho messo la TextBox e il CalendarExtender. Non ho apportato modifiche al codice che avevi fornito tu.
    Ho solamente aggiunto una Label per farmi stampare il risultato della conversione a DateTime.
  • Default.aspx.vb, il codefile dove ho messo la conversione da stringa a DateTime. Ho usato il metodo Parse come ti dicevo.
  • web.config, dove ho aggiunto l'elemento <globalization uiCulture="auto" culture="auto" />
  • Site.Master, che è la MasterPage in cui si trova il mio controllo asp:ScriptManager. Gli ho semplicemente aggiunto i due attributi EnableScriptGlobalization="true" ed EnableScriptLocalization="true", come indicato nella pagina di esempio.


Non ho fatto altre modifiche. Rispetto al consiglio che ti avevo dato l'altra volta ho solo aggiunto l'attributo EnableScriptGlobalization="true" allo ScriptManager.



ciao,
Moreno
Modificato da BrightSoul il 08 dicembre 2015 14.41 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.