Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / xsp / System / Web / UI / WebControls / basecomparevalidator.cs / 1 / basecomparevalidator.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.UI.WebControls { using System.ComponentModel; using System.Drawing; using System.Globalization; using System.Web; using System.Web.UI.HtmlControls; using System.Text.RegularExpressions; using System.Text; using System.Security.Permissions; using System.Web.Util; ////// [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] public abstract class BaseCompareValidator : BaseValidator { ///Serves as the abstract base /// class for validators that do typed comparisons. ////// [ WebCategory("Behavior"), Themeable(false), DefaultValue(ValidationDataType.String), WebSysDescription(SR.RangeValidator_Type) ] public ValidationDataType Type { get { object o = ViewState["Type"]; return((o == null) ? ValidationDataType.String : (ValidationDataType)o); } set { if (value < ValidationDataType.String || value > ValidationDataType.Currency) { throw new ArgumentOutOfRangeException("value"); } ViewState["Type"] = value; } } ///Gets or sets the data type that specifies how the values /// being compared should be interpreted. ////// Whether we should do culture invariant conversion against the /// string value properties on the control /// [ WebCategory("Behavior"), Themeable(false), DefaultValue(false), WebSysDescription(SR.BaseCompareValidator_CultureInvariantValues) ] public bool CultureInvariantValues { get { object o = ViewState["CultureInvariantValues"]; return((o == null) ? false : (bool)o); } set { ViewState["CultureInvariantValues"] = value; } } ////// /// AddAttributesToRender method /// protected override void AddAttributesToRender(HtmlTextWriter writer) { base.AddAttributesToRender(writer); if (RenderUplevel) { ValidationDataType type = Type; if (type != ValidationDataType.String) { string id = ClientID; HtmlTextWriter expandoAttributeWriter = (EnableLegacyRendering) ? writer : null; AddExpandoAttribute(expandoAttributeWriter, id, "type", PropertyConverter.EnumToString(typeof(ValidationDataType), type), false); NumberFormatInfo info = NumberFormatInfo.CurrentInfo; if (type == ValidationDataType.Double) { string decimalChar = info.NumberDecimalSeparator; AddExpandoAttribute(expandoAttributeWriter, id, "decimalchar", decimalChar); } else if (type == ValidationDataType.Currency) { string decimalChar = info.CurrencyDecimalSeparator; AddExpandoAttribute(expandoAttributeWriter, id, "decimalchar", decimalChar); string groupChar = info.CurrencyGroupSeparator; // Map non-break space onto regular space for parsing if (groupChar[0] == 160) groupChar = " "; AddExpandoAttribute(expandoAttributeWriter, id, "groupchar", groupChar); int digits = info.CurrencyDecimalDigits; AddExpandoAttribute(expandoAttributeWriter, id, "digits", digits.ToString(NumberFormatInfo.InvariantInfo), false); // VSWhidbey 83165 int groupSize = GetCurrencyGroupSize(info); if (groupSize > 0) { AddExpandoAttribute(expandoAttributeWriter, id, "groupsize", groupSize.ToString(NumberFormatInfo.InvariantInfo), false); } } else if (type == ValidationDataType.Date) { AddExpandoAttribute(expandoAttributeWriter, id, "dateorder", GetDateElementOrder(), false); AddExpandoAttribute(expandoAttributeWriter, id, "cutoffyear", CutoffYear.ToString(NumberFormatInfo.InvariantInfo), false); // VSWhidbey 504553: The changes of this bug make client-side script not // using the century attribute anymore, but still generating it for // backward compatibility with Everett pages. int currentYear = DateTime.Today.Year; int century = currentYear - (currentYear % 100); AddExpandoAttribute(expandoAttributeWriter, id, "century", century.ToString(NumberFormatInfo.InvariantInfo), false); } } } } ////// Check if the text can be converted to the type /// public static bool CanConvert(string text, ValidationDataType type) { return CanConvert(text, type, false); } public static bool CanConvert(string text, ValidationDataType type, bool cultureInvariant) { object value = null; return Convert(text, type, cultureInvariant, out value); } ////// /// Return the order of date elements for the current culture /// protected static string GetDateElementOrder() { DateTimeFormatInfo info = DateTimeFormatInfo.CurrentInfo; string shortPattern = info.ShortDatePattern; if (shortPattern.IndexOf('y') < shortPattern.IndexOf('M')) { return "ymd"; } else if (shortPattern.IndexOf('M') < shortPattern.IndexOf('d')) { return "mdy"; } else { return "dmy"; } } // VSWhidbey 83165 private static int GetCurrencyGroupSize(NumberFormatInfo info) { int [] groupSizes = info.CurrencyGroupSizes; if (groupSizes != null && groupSizes.Length == 1) { return groupSizes[0]; } else { return -1; } } ////// protected static int CutoffYear { get { return DateTimeFormatInfo.CurrentInfo.Calendar.TwoDigitYearMax; } } ///[To be supplied.] ////// protected static int GetFullYear(int shortYear) { Debug.Assert(shortYear >= 0 && shortYear < 100); return DateTimeFormatInfo.CurrentInfo.Calendar.ToFourDigitYear(shortYear); } ///[To be supplied.] ////// Try to convert the test into the validation data type /// protected static bool Convert(string text, ValidationDataType type, out object value) { return Convert(text, type, false, out value); } protected static bool Convert(string text, ValidationDataType type, bool cultureInvariant, out object value) { value = null; try { switch (type) { case ValidationDataType.String: value = text; break; case ValidationDataType.Integer: value = Int32.Parse(text, CultureInfo.InvariantCulture); break; case ValidationDataType.Double: { string cleanInput; if (cultureInvariant) { cleanInput = ConvertDouble(text, CultureInfo.InvariantCulture.NumberFormat); } else { cleanInput = ConvertDouble(text, NumberFormatInfo.CurrentInfo); } if (cleanInput != null) { value = Double.Parse(cleanInput, CultureInfo.InvariantCulture); } break; } case ValidationDataType.Date: { if (cultureInvariant) { value = ConvertDate(text, "ymd"); } else { // if the calendar is not gregorian, we should not enable client-side, so just parse it directly: if (!(DateTimeFormatInfo.CurrentInfo.Calendar.GetType() == typeof(GregorianCalendar))) { value = DateTime.Parse(text, CultureInfo.CurrentCulture); break; } string dateElementOrder = GetDateElementOrder(); value = ConvertDate(text, dateElementOrder); } break; } case ValidationDataType.Currency: { string cleanInput; if (cultureInvariant) { cleanInput = ConvertCurrency(text, CultureInfo.InvariantCulture.NumberFormat); } else { cleanInput = ConvertCurrency(text, NumberFormatInfo.CurrentInfo); } if (cleanInput != null) { value = Decimal.Parse(cleanInput, CultureInfo.InvariantCulture); } break; } } } catch { value = null; } return (value != null); } private static string ConvertCurrency(string text, NumberFormatInfo info) { string decimalChar = info.CurrencyDecimalSeparator; string groupChar = info.CurrencyGroupSeparator; // VSWhidbey 83165 string beginGroupSize, subsequentGroupSize; int groupSize = GetCurrencyGroupSize(info); if (groupSize > 0) { string groupSizeText = groupSize.ToString(NumberFormatInfo.InvariantInfo); beginGroupSize = "{1," + groupSizeText + "}"; subsequentGroupSize = "{" + groupSizeText + "}"; } else { beginGroupSize = subsequentGroupSize = "+"; } // Map non-break space onto regular space for parsing if (groupChar[0] == 160) groupChar = " "; int digits = info.CurrencyDecimalDigits; bool hasDigits = (digits > 0); string currencyExpression = "^\\s*([-\\+])?((\\d" + beginGroupSize + "(\\" + groupChar + "\\d" + subsequentGroupSize + ")+)|\\d*)" + (hasDigits ? "\\" + decimalChar + "?(\\d{0," + digits.ToString(NumberFormatInfo.InvariantInfo) + "})" : string.Empty) + "\\s*$"; Match m = Regex.Match(text, currencyExpression); if (!m.Success) { return null; } // Make sure there are some valid digits if (m.Groups[2].Length == 0 && hasDigits && m.Groups[5].Length == 0) { return null; } return m.Groups[1].Value + m.Groups[2].Value.Replace(groupChar, string.Empty) + ((hasDigits && m.Groups[5].Length > 0) ? "." + m.Groups[5].Value : string.Empty); } private static string ConvertDouble(string text, NumberFormatInfo info) { // VSWhidbey 83156: If text is empty, it would be default to 0 for // backward compatibility reason. if (text.Length == 0) { return "0"; } string decimalChar = info.NumberDecimalSeparator; string doubleExpression = "^\\s*([-\\+])?(\\d*)\\" + decimalChar + "?(\\d*)\\s*$"; Match m = Regex.Match(text, doubleExpression); if (!m.Success) { return null; } // Make sure there are some valid digits if (m.Groups[2].Length == 0 && m.Groups[3].Length == 0) { return null; } return m.Groups[1].Value + (m.Groups[2].Length > 0 ? m.Groups[2].Value : "0") + ((m.Groups[3].Length > 0) ? "." + m.Groups[3].Value: string.Empty); } private static object ConvertDate(string text, string dateElementOrder) { // always allow the YMD format, if they specify 4 digits string dateYearFirstExpression = "^\\s*((\\d{4})|(\\d{2}))([-/]|\\. ?)(\\d{1,2})\\4(\\d{1,2})\\s*$"; Match m = Regex.Match(text, dateYearFirstExpression); int day, month, year; if (m.Success && (m.Groups[2].Success || dateElementOrder == "ymd")) { day = Int32.Parse(m.Groups[6].Value, CultureInfo.InvariantCulture); month = Int32.Parse(m.Groups[5].Value, CultureInfo.InvariantCulture); if (m.Groups[2].Success) { year = Int32.Parse(m.Groups[2].Value, CultureInfo.InvariantCulture); } else { year = GetFullYear(Int32.Parse(m.Groups[3].Value, CultureInfo.InvariantCulture)); } } else { if (dateElementOrder == "ymd") { return null; } // also check for the year last format string dateYearLastExpression = "^\\s*(\\d{1,2})([-/]|\\. ?)(\\d{1,2})\\2((\\d{4})|(\\d{2}))\\s*$"; m = Regex.Match(text, dateYearLastExpression); if (!m.Success) { return null; } if (dateElementOrder == "mdy") { day = Int32.Parse(m.Groups[3].Value, CultureInfo.InvariantCulture); month = Int32.Parse(m.Groups[1].Value, CultureInfo.InvariantCulture); } else { day = Int32.Parse(m.Groups[1].Value, CultureInfo.InvariantCulture); month = Int32.Parse(m.Groups[3].Value, CultureInfo.InvariantCulture); } if (m.Groups[5].Success) { year = Int32.Parse(m.Groups[5].Value, CultureInfo.InvariantCulture); } else { year = GetFullYear(Int32.Parse(m.Groups[6].Value, CultureInfo.InvariantCulture)); } } return new DateTime(year, month, day); } ////// Compare two strings using the type and operator /// protected static bool Compare(string leftText, string rightText, ValidationCompareOperator op, ValidationDataType type) { return Compare(leftText, false, rightText, false, op, type); } protected static bool Compare(string leftText, bool cultureInvariantLeftText, string rightText, bool cultureInvariantRightText, ValidationCompareOperator op, ValidationDataType type) { object leftObject; if (!Convert(leftText, type, cultureInvariantLeftText, out leftObject)) return false; if (op == ValidationCompareOperator.DataTypeCheck) return true; object rightObject; if (!Convert(rightText, type, cultureInvariantRightText, out rightObject)) return true; int compareResult; switch (type) { case ValidationDataType.String: compareResult = String.Compare((string)leftObject, (string) rightObject, false, CultureInfo.CurrentCulture); break; case ValidationDataType.Integer: compareResult = ((int)leftObject).CompareTo(rightObject); break; case ValidationDataType.Double: compareResult = ((double)leftObject).CompareTo(rightObject); break; case ValidationDataType.Date: compareResult = ((DateTime)leftObject).CompareTo(rightObject); break; case ValidationDataType.Currency: compareResult = ((Decimal)leftObject).CompareTo(rightObject); break; default: Debug.Fail("Unknown Type"); return true; } switch (op) { case ValidationCompareOperator.Equal: return compareResult == 0; case ValidationCompareOperator.NotEqual: return compareResult != 0; case ValidationCompareOperator.GreaterThan: return compareResult > 0 ; case ValidationCompareOperator.GreaterThanEqual: return compareResult >= 0 ; case ValidationCompareOperator.LessThan: return compareResult < 0 ; case ValidationCompareOperator.LessThanEqual: return compareResult <= 0 ; default: Debug.Fail("Unknown Operator"); return true; } } ////// protected override bool DetermineRenderUplevel() { // We don't do client-side validation for dates with non gregorian calendars if (Type == ValidationDataType.Date && DateTimeFormatInfo.CurrentInfo.Calendar.GetType() != typeof(GregorianCalendar)) { return false; } return base.DetermineRenderUplevel(); } internal string ConvertToShortDateString(string text) { // VSWhidbey 83099, 85305, we should ignore error if it happens and // leave text as intact when parsing the date. We assume the caller // (validator) is able to handle invalid text itself. DateTime date; if (DateTime.TryParse(text, CultureInfo.CurrentCulture, DateTimeStyles.None, out date)) { text = date.ToShortDateString(); } return text; } internal bool IsInStandardDateFormat(string date) { // VSWhidbey 115454: We identify that date string with only numbers // and specific punctuation separators is in standard date format. const string standardDateExpression = "^\\s*(\\d+)([-/]|\\. ?)(\\d+)\\2(\\d+)\\s*$"; return Regex.Match(date, standardDateExpression).Success; } internal string ConvertCultureInvariantToCurrentCultureFormat(string valueInString, ValidationDataType type) { object value; Convert(valueInString, type, true, out value); if (value is DateTime) { // For Date type we explicitly want the date portion only return ((DateTime) value).ToShortDateString(); } else { return System.Convert.ToString(value, CultureInfo.CurrentCulture); } } } }[To be supplied.] ///
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ObjectStateEntryDbUpdatableDataRecord.cs
- ErrorProvider.cs
- KeyFrames.cs
- MultiSelectRootGridEntry.cs
- TagNameToTypeMapper.cs
- LayoutEngine.cs
- EmptyReadOnlyDictionaryInternal.cs
- AttributeTable.cs
- DelegateArgumentReference.cs
- ClientWindowsAuthenticationMembershipProvider.cs
- DataBoundControlHelper.cs
- StreamUpdate.cs
- Aggregates.cs
- FrameworkElementFactoryMarkupObject.cs
- Int32Animation.cs
- DataServiceRequestException.cs
- StateDesigner.Layouts.cs
- SecureUICommand.cs
- ChangePassword.cs
- TextTreeNode.cs
- NoClickablePointException.cs
- Win32PrintDialog.cs
- SqlReferenceCollection.cs
- SecurityRuntime.cs
- ExpressionNode.cs
- DbConnectionFactory.cs
- Marshal.cs
- AssociatedControlConverter.cs
- HighlightVisual.cs
- NativeMethodsOther.cs
- EventLogEntryCollection.cs
- ModelTreeEnumerator.cs
- AssemblyCache.cs
- PartialArray.cs
- DataSourceExpression.cs
- SliderAutomationPeer.cs
- NamespaceCollection.cs
- ConstrainedDataObject.cs
- PathGeometry.cs
- UrlAuthFailedErrorFormatter.cs
- EntryWrittenEventArgs.cs
- CompositionDesigner.cs
- SecUtil.cs
- SettingsSavedEventArgs.cs
- Relationship.cs
- HostingEnvironmentSection.cs
- ToolStripDropDownButton.cs
- PixelFormat.cs
- DataGridViewBand.cs
- VSWCFServiceContractGenerator.cs
- JoinQueryOperator.cs
- OperationGenerator.cs
- PermissionSet.cs
- ToolStripDropDownMenu.cs
- DiscoveryDocumentSearchPattern.cs
- ConfigXmlWhitespace.cs
- ApplyImportsAction.cs
- TiffBitmapEncoder.cs
- PlainXmlSerializer.cs
- PropertyGridEditorPart.cs
- ParameterCollection.cs
- HtmlEncodedRawTextWriter.cs
- Panel.cs
- ScrollProviderWrapper.cs
- KeyInterop.cs
- XamlClipboardData.cs
- RecognizedPhrase.cs
- XmlComment.cs
- ArithmeticException.cs
- VoiceObjectToken.cs
- linebase.cs
- ProfileEventArgs.cs
- CircleHotSpot.cs
- StyleSelector.cs
- ImageAnimator.cs
- EnumerableRowCollectionExtensions.cs
- HttpConfigurationContext.cs
- UTF7Encoding.cs
- MinimizableAttributeTypeConverter.cs
- EntityContainerAssociationSet.cs
- FtpRequestCacheValidator.cs
- DataTable.cs
- ManagedIStream.cs
- InertiaTranslationBehavior.cs
- MenuCommands.cs
- DBConnectionString.cs
- shaperfactory.cs
- DataGridTableCollection.cs
- OleDbMetaDataFactory.cs
- ScaleTransform.cs
- odbcmetadatacolumnnames.cs
- UIElementParagraph.cs
- WindowsEditBox.cs
- Accessors.cs
- QilScopedVisitor.cs
- WebPartEditVerb.cs
- RSAPKCS1SignatureDeformatter.cs
- ControlCachePolicy.cs
- ProcessStartInfo.cs
- DefaultConfirmation.cs