Vorgehensweise: Konvertieren numerischer Benutzereingaben in Websteuerelementen in ZahlenHow to: Convert Numeric User Input in Web Controls to Numbers

Da eine Webseite in verschiedensten Ländern auf der ganzen Welt angezeigt werden kann, können Benutzer numerische Daten in einer nahezu unbegrenzten Anzahl von Formaten in ein TextBox-Steuerelement einfügen.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. Daher ist es von entscheidender Bedeutung, das Gebietsschema und die Kultur des Webseitenbenutzers zu ermitteln.As a result, it is very important to determine the locale and culture of the Web page's user. Bei der Analyse von Benutzereingaben können Sie dann die vom Gebietsschema und der Kultur des Benutzers definierten Formatierungskonventionen anwenden.When you parse user input, you can then apply the formatting conventions defined by the user's locale and culture.

So konvertieren Sie numerische Eingaben eines TextBox-Websteuerelements in eine ZahlTo convert numeric input from a Web TextBox control to a number

  1. Stellen Sie fest, ob das von der HttpRequest.UserLanguages-Eigenschaft zurückgegebene Zeichenfolgenarray aufgefüllt ist.Determine whether the string array returned by the HttpRequest.UserLanguages property is populated. Wenn dies nicht der Fall ist, fahren Sie mit Schritt 6 fort.If it is not, continue to step 6.

  2. Wenn das von der UserLanguages-Eigenschaft zurückgegebene Zeichenfolgenarray aufgefüllt ist, rufen Sie sein erstes Element ab.If the string array returned by the UserLanguages property is populated, retrieve its first element. Das erste Element gibt die Standardeinstellung des Benutzers oder seine bevorzugte Sprache und Region an.The first element indicates the user's default or preferred language and region.

  3. Instanziieren Sie durch Aufrufen des CultureInfo.CultureInfo(String, Boolean)-Konstruktors ein CultureInfo-Objekt, das die bevorzugte Kultur des Benutzers darstellt.Instantiate a CultureInfo object that represents the user's preferred culture by calling the CultureInfo.CultureInfo(String, Boolean) constructor.

  4. Rufen Sie entweder die TryParse- oder Parse-Methode des numerischen Typs auf, in den die Benutzereingabe konvertiert werden soll.Call either the TryParse or the Parse method of the numeric type that you want to convert the user's input to. Verwenden Sie eine Überladung der TryParse- oder Parse-Methode mit einem provider-Parameter, und übergeben Sie sie an eines der folgenden Objekte:Use an overload of the TryParse or the Parse method with a provider parameter, and pass it either of the following:

  5. Wenn bei der Konvertierung ein Fehler auftritt, wiederholen Sie die Schritte 2 bis 4 für jedes verbleibende Element im von der UserLanguages-Eigenschaft zurückgegebenen Zeichenfolgenarray.If the conversion fails, repeat steps 2 through 4 for each remaining element in the string array returned by the UserLanguages property.

  6. Wenn bei der Konvertierung weiterhin ein Fehler auftritt, oder das von der UserLanguages-Eigenschaft zurückgegebene Zeichenfolgenarray leer ist, analysieren Sie die Zeichenfolge mit der invarianten Kultur, die durch die CultureInfo.InvariantCulture-Eigenschaft zurückgegeben wird.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.

BeispielExample

Im folgenden Beispiel wird die gesamte CodeBehind-Seite für ein Webformular dargestellt, das den Benutzer dazu auffordert, einen numerischen Wert in ein TextBox-Steuerelement einzugeben, und diesen Wert in eine Zahl konvertiert.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. Diese Zahl wird dann verdoppelt und mit den gleichen Formatierungsregeln wie denen der ursprünglichen Eingabe angezeigt.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

Zum Auffüllen der HttpRequest.UserLanguages-Eigenschaft kommen die Kulturnamen infrage, die sich in den in einer HTTP-Anforderung enthaltenen Accept-Language-Headern befinden.The HttpRequest.UserLanguages property is populated from the culture names that are contained in Accept-Language headers included in an HTTP request. Allerdings sind nicht in den Anforderungen aller Browser Accept-Language-Header enthalten, und die Benutzer können die Header auch vollständig unterdrücken.However, not all browsers include Accept-Language headers in their requests, and users can also suppress the headers completely. Daher ist es wichtig, dass bei der Analyse der Benutzereingabe eine Fallbackkultur verfügbar ist.This makes it important to have a fallback culture when parsing user input. In der Regel ist die Fallbackkultur die von CultureInfo.InvariantCulture zurückgegebene invariante Kultur.Typically, the fallback culture is the invariant culture returned by CultureInfo.InvariantCulture. Benutzer können für den Internet Explorer auch Kulturnamen bereitstellen, die sie in ein Textfeld eingeben, was die Gefahr mit sich bringt, dass die Kulturnamen möglicherweise ungültig sind.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. Daher ist es wichtig, bei der Instanziierung eines CultureInfo-Objekts eine Ausnahmebehandlung zu verwenden.This makes it important to use exception handling when instantiating a CultureInfo object.

Beim Abrufen durch eine vom Internet Explorer übermittelte HTTP-Anforderung wird das HttpRequest.UserLanguages-Array in der durch die Benutzervoreinstellung vorgegebenen Reihenfolge aufgefüllt.When retrieved from an HTTP request submitted by Internet Explorer, the HttpRequest.UserLanguages array is populated in order of user preference. Das erste Element im Array enthält den Namen der primären Kultur/Region des Benutzers.The first element in the array contains the name of the user's primary culture/region. Wenn das Array zusätzliche Elemente enthält, weist der Internet Explorer ihnen nach dem Zufallsprinzip einen Qualitätsspezifizierer zu, der durch ein Semikolon vom Namen der Kultur getrennt wird.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. Beispielsweise kann ein Eintrag für die Kultur „fr-FR“ das Format fr-FR;q=0.7 aufweisen.For example, an entry for the fr-FR culture might take the form fr-FR;q=0.7.

Im Beispiel wird der CultureInfo-Konstruktor mit seinem auf false festgelegten useUserOverride-Parametersatz zum Erstellen eines neuen CultureInfo-Objekts aufgerufen.The example calls the CultureInfo constructor with its useUserOverride parameter set to false to create a new CultureInfo object. Wenn der Kulturname der Standardkulturname auf dem Server ist, wird dadurch sichergestellt, dass das vom Klassenkonstruktor erstellte neue CultureInfo-Objekt die Standardeinstellungen einer Kultur enthält und keine mit der Anwendung Regions- und Sprachoptionen des Servers überschriebenen Einstellungen widerspiegelt.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. Es ist unwahrscheinlich, dass die Werte überschriebener Einstellungen auf dem Server auf dem System des Benutzers vorhanden sind oder in der Eingabe des Benutzers widergespiegelt werden.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.

Ihr Code kann entweder die Parse- oder TryParse-Methode des numerischen Typs aufrufen, in den die Benutzereingabe konvertiert wird.Your code can call either the Parse or the TryParse method of the numeric type that the user's input will be converted to. Wiederholte an eine Analysemethode gerichtete Aufrufe können für einen einzelnen Analysevorgang erforderlich sein.Repeated calls to a parse method may be required for a single parsing operation. Daher ist die TryParse-Methode besser, weil sie false zurückgibt, wenn bei einem Analysevorgang ein Fehler auftritt.As a result, the TryParse method is better, because it returns false if a parse operation fails. Im Gegensatz dazu kann das Behandeln wiederholter Ausnahmen, die ggf. von der Parse-Methode ausgelöst werden, ein sehr ressourcenintensiver Vorgang in einer Webanwendung sein.In contrast, handling the repeated exceptions that may be thrown by the Parse method can be a very expensive proposition in a Web application.

Kompilieren des CodesCompiling the Code

Um den Code zu kompilieren, kopieren Sie ihn in eine ASP.NET-CodeBehind-Seite, damit diese den gesamten vorhandenen Code ersetzt.To compile the code, copy it into an ASP.NET code-behind page so that it replaces all the existing code. Die ASP.NET-Webseite sollte folgende Steuerelemente enthalten:The ASP.NET Web page should contain the following controls:

  • Ein Label-Steuerelement, auf das nicht im Code verwiesen wird.A Label control, which is not referenced in code. Legen Sie seine Text-Eigenschaft auf „Geben Sie eine Zahl ein:“ fest.Set its Text property to "Enter a Number:".

  • Ein TextBox-Steuerelement namens NumericString.A TextBox control named NumericString.

  • Ein Button-Steuerelement namens OKButton.A Button control named OKButton. Legen Sie seine Text-Eigenschaft auf „OK“ fest.Set its Text property to "OK".

Ändern Sie den Namen der Klasse von NumericUserInput in den Namen der Klasse, die vom Inherits-Attribut der Page-Anweisung der ASP.NET-Seite definiert wird.Change the name of the class from NumericUserInput to the name of the class that is defined by the Inherits attribute of the ASP.NET page's Page directive. Ändern Sie den Namen des NumericInput-Objektverweises in den Namen, der mit dem id-Attribut des form-Tags der ASP.NET-Seite definiert wird.Change the name of the NumericInput object reference to the name defined by the id attribute of the ASP.NET page's form tag.

.NET Framework-Sicherheit.NET Framework Security

Um zu verhindern, dass ein Benutzer ein Skript in den HTML-Stream einfügt, sollte eine Benutzereingabe nie direkt in der Antwort des Servers wiederholt werden.To prevent a user from injecting script into the HTML stream, user input should never be directly echoed back in the server response. Sie sollte stattdessen mithilfe der HttpServerUtility.HtmlEncode-Methode codiert werden.Instead, it should be encoded by using the HttpServerUtility.HtmlEncode method.

Siehe auchSee also