Procedura: convertire in numeri l'input numerico dell'utente nei controlli WebHow to: Convert Numeric User Input in Web Controls to Numbers

Poiché una pagina Web può essere visualizzata ovunque nel mondo, gli utenti possono immettere dati numerici in un controllo TextBox in un numero praticamente illimitato di formati.Because a Web page can be displayed anywhere in the world, users can input numeric data into a TextBox control in an almost unlimited number of formats. Di conseguenza, è molto importante determinare le impostazioni locali e le impostazioni cultura dell'utente della pagina Web.As a result, it is very important to determine the locale and culture of the Web page's user. Quando si analizza l'input dell'utente, è quindi possibile applicare le convenzioni di formattazione definite dalle impostazioni locali e dalle impostazioni cultura dell'utente.When you parse user input, you can then apply the formatting conventions defined by the user's locale and culture.

Per convertire l'input numerico da un controllo Web TextBox a un numeroTo convert numeric input from a Web TextBox control to a number

  1. Determinare se la matrice di stringhe restituita dalla proprietà HttpRequest.UserLanguages è popolata.Determine whether the string array returned by the HttpRequest.UserLanguages property is populated. In caso contrario, andare al passaggio 6.If it is not, continue to step 6.

  2. Se la matrice di stringhe restituita dalla proprietà UserLanguages è popolata, recuperarne il primo elemento.If the string array returned by the UserLanguages property is populated, retrieve its first element. Il primo elemento indica la lingua e l'area geografica predefinite o preferite dell'utente.The first element indicates the user's default or preferred language and region.

  3. Creare un'istanza di un oggetto CultureInfo che rappresenta le impostazioni cultura preferite dell'utente chiamando il costruttore CultureInfo.CultureInfo(String, Boolean).Instantiate a CultureInfo object that represents the user's preferred culture by calling the CultureInfo.CultureInfo(String, Boolean) constructor.

  4. Chiamare il metodo TryParse o Parse del tipo numerico in cui si vuole convertire l'input dell'utente.Call either the TryParse or the Parse method of the numeric type that you want to convert the user's input to. Usare un overload del metodo TryParse o Parse con un parametro provider e passare uno degli oggetti seguenti:Use an overload of the TryParse or the Parse method with a provider parameter, and pass it either of the following:

  5. Se la conversione non riesce, ripetere i passaggi da 2 a 4 per ogni elemento rimanente nella matrice di stringhe restituita dalla proprietà UserLanguages.If the conversion fails, repeat steps 2 through 4 for each remaining element in the string array returned by the UserLanguages property.

  6. Se la conversione continua a non riuscire o se la matrice di stringhe restituita dalla proprietà UserLanguages è vuota, analizzare la stringa usando le impostazioni cultura inglese non dipendenti da paese/area geografica, restituite dalla proprietà CultureInfo.InvariantCulture.If the conversion still fails or if the string array returned by the UserLanguages property is empty, parse the string by using the invariant culture, which is returned by the CultureInfo.InvariantCulture property.

EsempioExample

L'esempio seguente è la pagina code-behind completa per un Web Form che chiede all'utente di immettere un valore numerico in un controllo TextBox e lo converte in numero.The following example is the complete code-behind page for a Web form that asks the user to enter a numeric value in a TextBox control and converts it to a number. Questo numero viene quindi raddoppiato e visualizzato usando le stesse regole di formattazione dell'input originale.That number is then doubled and displayed by using the same formatting rules as the original input.

using System;
using System.Globalization;

partial class NumericUserInput : System.Web.UI.Page
{
   protected void OKButton_Click(object sender, EventArgs e)
   {
      string locale;
      CultureInfo culture = null;
      double number = 0;
      bool result = false;

      // Exit if input is absent.
      if (String.IsNullOrEmpty(this.NumericString.Text)) return;

      // Hide form elements.
      this.NumericInput.Visible = false;

      // Get user culture/region
      if (!(Request.UserLanguages.Length == 0 || String.IsNullOrEmpty(Request.UserLanguages[0])))
      {
         try
         {
            locale = Request.UserLanguages[0];
            culture = new CultureInfo(locale, false);

            // Parse input using user culture.
            result = Double.TryParse(this.NumericString.Text, NumberStyles.Any,
                                     culture.NumberFormat, out number);
         }
         catch { }
         // If parse fails, parse input using any additional languages.
         if (!result)
         {
            if (Request.UserLanguages.Length > 1)
            {
               for (int ctr = 1; ctr <= Request.UserLanguages.Length - 1; ctr++)
               {
                  try
                  {
                     locale = Request.UserLanguages[ctr];
                     // Remove quality specifier, if present.
                     locale = locale.Substring(1, locale.IndexOf(';') - 1);
                     culture = new CultureInfo(Request.UserLanguages[ctr], false);
                     result = Double.TryParse(this.NumericString.Text, NumberStyles.Any, culture.NumberFormat, out number);
                     if (result) break;
                  }
                  catch { }
               }
            }
         }
      }
      // If parse operation fails, use invariant culture.
      if (!result)
         result = Double.TryParse(this.NumericString.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out number);

      // Double result.
      number *= 2;

      // Display result to user.
      if (result)
      {
         Response.Write("<P />");
         Response.Write(Server.HtmlEncode(this.NumericString.Text) + " * 2 = " + number.ToString("N", culture) + "<BR />");
      }
      else
      {
         // Unhide form.
         this.NumericInput.Visible = true;

         Response.Write("<P />");
         Response.Write("Unable to recognize " + Server.HtmlEncode(this.NumericString.Text));
      }
   }
}
Imports System.Globalization

Partial Class NumericUserInput
   Inherits System.Web.UI.Page

   Protected Sub OKButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles OKButton.Click
      Dim locale As String
      Dim culture As CultureInfo = Nothing
      Dim number As Double
      Dim result As Boolean

      ' Exit if input is absent.
      If String.IsNullOrEmpty(Me.NumericString.Text) Then Exit Sub

      ' Hide form elements.
      Me.NumericInput.Visible = False

      ' Get user culture/region
      If Not (Request.UserLanguages.Length = 0 OrElse String.IsNullOrEmpty(Request.UserLanguages(0))) Then
         Try
            locale = Request.UserLanguages(0)
            culture = New CultureInfo(locale, False)

            ' Parse input using user culture.
            result = Double.TryParse(Me.NumericString.Text, NumberStyles.Any, culture.NumberFormat, number)
         Catch
         End Try
         ' If parse fails, parse input using any additional languages.
         If Not result Then
            If Request.UserLanguages.Length > 1 Then
               For ctr As Integer = 1 To Request.UserLanguages.Length - 1
                  Try
                     locale = Request.UserLanguages(ctr)
                     ' Remove quality specifier, if present.
                     locale = Left(locale, InStr(locale, ";") - 1)
                     culture = New CultureInfo(Request.UserLanguages(ctr), False)
                     result = Double.TryParse(Me.NumericString.Text, NumberStyles.Any, culture.NumberFormat, number)
                     If result Then Exit For
                  Catch
                  End Try
               Next
            End If
         End If
      End If
      ' If parse operation fails, use invariant culture.
      If Not result Then
         result = Double.TryParse(Me.NumericString.Text, NumberStyles.Any, CultureInfo.InvariantCulture, number)
      End If
      ' Double result
      number *= 2

      ' Display result to user.
      If result Then
         Response.Write("<P />")
         Response.Write(Server.HtmlEncode(Me.NumericString.Text) + " * 2 = " + number.ToString("N", culture) + "<BR />")
      Else
         ' Unhide form.
         Me.NumericInput.Visible = True

         Response.Write("<P />")
         Response.Write("Unable to recognize " + Server.HtmlEncode(Me.NumericString.Text))
      End If
   End Sub   
End Class

La proprietà HttpRequest.UserLanguages viene popolata con i nomi delle impostazioni cultura contenuti nelle intestazioni Accept-Language incluse in una richiesta HTTP.The HttpRequest.UserLanguages property is populated from the culture names that are contained in Accept-Language headers included in an HTTP request. Tuttavia, non tutti i browser includono intestazioni Accept-Language nelle rispettive richieste e gli utenti possono anche eliminare completamente le intestazioni.However, not all browsers include Accept-Language headers in their requests, and users can also suppress the headers completely. Di conseguenza, è importante avere impostazioni cultura di fallback durante l'analisi dell'input dell'utente.This makes it important to have a fallback culture when parsing user input. In genere le impostazioni cultura di fallback sono le impostazioni cultura inglese non dipendenti da paese/area geografica restituite da CultureInfo.InvariantCulture.Typically, the fallback culture is the invariant culture returned by CultureInfo.InvariantCulture. Gli utenti possono anche fornire a Internet Explorer nomi delle impostazioni cultura immessi in una casella di testo, ma questo crea la possibilità che tali nomi non siano validi.Users can also provide Internet Explorer with culture names that they input in a text box, which creates the possibility that the culture names may not be valid. Di conseguenza, è importante usare la gestione delle eccezioni quando si crea un'istanza di un oggetto CultureInfo.This makes it important to use exception handling when instantiating a CultureInfo object.

Quando viene recuperata da una richiesta HTTP inviata da Internet Explorer, la matrice HttpRequest.UserLanguages viene popolata in base alla preferenza dell'utente.When retrieved from an HTTP request submitted by Internet Explorer, the HttpRequest.UserLanguages array is populated in order of user preference. Il primo elemento nella matrice contiene il nome delle impostazioni cultura/area geografica primarie dell'utente.The first element in the array contains the name of the user's primary culture/region. Se la matrice contiene elementi aggiuntivi, Internet Explorer assegna loro arbitrariamente un identificatore di qualità, che è separato dal nome delle impostazioni cultura da un punto e virgola.If the array contains any additional items, Internet Explorer arbitrarily assigns them a quality specifier, which is delimited from the culture name by a semicolon. Ad esempio, una voce per le impostazioni cultura fr-FR può avere questo formato: fr-FR;q=0.7.For example, an entry for the fr-FR culture might take the form fr-FR;q=0.7.

L'esempio chiama il costruttore CultureInfo con il relativo parametro useUserOverride impostato su false per creare un nuovo oggetto CultureInfo.The example calls the CultureInfo constructor with its useUserOverride parameter set to false to create a new CultureInfo object. In questo modo, se il nome delle impostazioni cultura è il nome delle impostazioni cultura predefinite nel server, il nuovo oggetto CultureInfo creato dal costruttore di classe contiene le impostazioni cultura predefinite e non riflette alcuna impostazione sostituita usando l'applicazione Opzioni internazionali e della lingua del server.This ensures that, if the culture name is the default culture name on the server, the new CultureInfo object created by the class constructor contains a culture's default settings and does not reflect any settings overridden by using the server's Regional and Language Options application. Vi è una probabilità ridotta che i valori delle impostazioni sostituite nel server siano presenti nel sistema dell'utente o si riflettano sull'input dell'utente.The values from any overridden settings on the server are unlikely to exist on the user's system or to be reflected in the user's input.

Il codice può chiamare il metodo Parse o TryParse del tipo numerico in cui verrà convertito l'input dell'utente.Your code can call either the Parse or the TryParse method of the numeric type that the user's input will be converted to. Per una singola operazione di analisi, possono essere necessarie chiamate ripetute a un metodo di analisi.Repeated calls to a parse method may be required for a single parsing operation. Di conseguenza, il metodo TryParse è quello preferibile perché restituisce false se un'operazione di analisi non riesce.As a result, the TryParse method is better, because it returns false if a parse operation fails. Al contrario, la gestione delle eccezioni ripetute che possono essere generate dal metodo Parse può rivelarsi un problema molto costoso in un'applicazione Web.In contrast, handling the repeated exceptions that may be thrown by the Parse method can be a very expensive proposition in a Web application.

Compilazione del codiceCompiling the Code

Per compilare il codice, copiarlo in una pagina code-behind ASP.NETASP.NET in modo da sostituire tutto il codice esistente.To compile the code, copy it into an ASP.NETASP.NET code-behind page so that it replaces all the existing code. La pagina Web ASP.NETASP.NET deve contenere i controlli seguenti:The ASP.NETASP.NET Web page should contain the following controls:

  • Controllo Label, che non è referenziato nel codice.A Label control, which is not referenced in code. Impostarne la proprietà Text su "Immettere un numero:".Set its Text property to "Enter a Number:".

  • Un controllo TextBox denominato NumericString.A TextBox control named NumericString.

  • Un controllo Button denominato OKButton.A Button control named OKButton. Impostarne la proprietà Text su "OK".Set its Text property to "OK".

Modificare il nome della classe da NumericUserInput al nome della classe definita dall'attributo Inherits della direttiva Page della pagina ASP.NETASP.NET.Change the name of the class from NumericUserInput to the name of the class that is defined by the Inherits attribute of the ASP.NETASP.NET page's Page directive. Modificare il nome del riferimento all'oggetto NumericInput nel nome definito dall'attributo id del tag form della pagina ASP.NETASP.NET.Change the name of the NumericInput object reference to the name defined by the id attribute of the ASP.NETASP.NET page's form tag.

Sicurezza di .NET Framework.NET Framework Security

Per impedire a un utente di inserire script nel flusso HTML, l'input dell'utente non deve essere mai restituito direttamente nella risposta del server.To prevent a user from injecting script into the HTML stream, user input should never be directly echoed back in the server response. Al contrario, deve essere codificato tramite il metodo HttpServerUtility.HtmlEncode.Instead, it should be encoded by using the HttpServerUtility.HtmlEncode method.

Vedere ancheSee Also

Esecuzione di operazioni di formattazionePerforming Formatting Operations
Analisi di stringhe numericheParsing Numeric Strings