7

PhoneNumber プロパティと Email プロパティの両方を持つ顧客クラスがあります。DataAnnotations を使用すると、プロパティを DataType 検証属性で装飾できますが、それが何を意味するのかわかりません。

例えば:

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

このプロパティに「1515999A」を割り当てた単体テストがあります。検証ランナーをステップ実行すると、値は電話番号に対して有効であると見なされます。私はこれが無効であるべきだと思っていたでしょう。

私はいくつかをグーグルで検索しましたが、列挙されたさまざまな DataTypes が実際にキャッチするものについての適切な説明を見つけることができませんでした。価値のある参照はどこかにありますか?

編集:

ここに私が検証ランナーに使用しているものの根性があります...

    public virtual XLValidationIssues ValidateAttributes<TEntity>(TEntity entity)
    {
        var validationIssues = new XLValidationIssues();

        // Get list of properties from validationModel
        var props = entity.GetType().GetProperties();

        // Perform validation on each property
        foreach (var prop in props)
            ValidateProperty(validationIssues, entity, prop);

        // Return the list
        return validationIssues;
    }

    protected virtual void ValidateProperty<TEntity>(XLValidationIssues validationIssues, TEntity entity, PropertyInfo property)
    {
        // Get list of validator attributes
        var validators = property.GetCustomAttributes(typeof(ValidationAttribute), true);
        foreach (ValidationAttribute validator in validators)
            ValidateValidator(validationIssues, entity, property, validator);
    }

    protected virtual void ValidateValidator<TEntity>(XLValidationIssues validationIssues, TEntity entity, PropertyInfo property, ValidationAttribute validator)
    {
        var value = property.GetValue(entity, null);
        if (!validator.IsValid(value))
            validationIssues.Add(new XLValidationIssue(property.Name, value, validator.FormatErrorMessage(property.Name, value)));
    }
4

4 に答える 4

7

私は DataType.PhoneNumber について Web 上で多くを見つけることができませんでしたが、私はこれを見つけました:

http://forums.asp.net/p/1370546/2863383.aspx

RTM リリースでは、DataType.EmailAddress は、独自に使用するデータの種類をマークするためにのみ使用されます。

もう少し詳しく知りたいと思ったので、Red Gate の .NET Reflector を取り出して調べてみました。

DataTypeAttribute クラスを見ると、Joseph Daigle が的確です。各 DataType 属性は検証を行いません。is は常に true (つまり「有効」) を返します。一部のデータ型では、一部のカスタム表示文字列の書式設定が行われます。ただし、電話番号はほとんどそのままです。

そこで、この問題の可能な解決策を調べました。私が見つけたものから、これは最高のように見えます:

public class EvenNumberAttribute : ValidationAttribute
{
    public EvenNumberAttribute() : base(() => Resource1.EvenNumberError) { }
    public EvenNumberAttribute(string errorMessage) : base(() => errorMessage) { }

    protected override ValidationResult IsValid(object value, 
        ValidationContext validationContext)
    {
        if (value == null)
        {
            return ValidationResult.Success;
        }

        int convertedValue;
        try
        {
            convertedValue = Convert.ToInt32(value);
        }
        catch (FormatException)
        {
            return new ValidationResult(Resource1.ConversionError);
        }

        if (convertedValue % 2 == 0)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
        }
    }
}

もちろん、それは数値が奇数か偶数かを検証します。実際に検証を行うPhoneNumber、Email などのカスタム検証属性を作成できます。

于 2009-12-09T15:46:26.350 に答える
3

電話番号、郵便番号は、RegularExpressionAttribute クラスで検証する必要があります

于 2010-11-14T21:28:39.360 に答える
1

DataTypeAttribute は ValidationAttribute です。しかし、それは常にtrueを返します...したがって、実際の検証は行いません。

(これが 3.5 に当てはまることは知っていますが、4.0 に当てはまるかどうかはわかりません)

于 2009-11-24T20:28:54.393 に答える
0

電話番号には文字が含まれている可能性があるためでしょうか。ウィキ

于 2009-12-08T09:46:02.080 に答える