20

現時点では、ExistingFileName (以下)というカスタム検証属性がありますが、表示するエラー メッセージを指定しています。

    protected override System.ComponentModel.DataAnnotations.ValidationResult IsValid(object value, System.ComponentModel.DataAnnotations.ValidationContext validationContext)
    {
        if (value!=null)
        {
            string fileName = value.ToString();
            if (FileExists(fileName))
            {
                return new ValidationResult("Sorry but there is already an image with this name please rename your image");
            }
            else
            {
                return ValidationResult.Success;
            }  
        }
        else
        {
            return new ValidationResult("Please enter a name for your image");
        }
    }

私はそれを次のように実装しました:

[ExistingFileName]
public string NameOfImage { get; set; }

以下のように属性を設定するときにエラーメッセージを定義する方法があると確信しています:

[ExistingFileName(errormessage="Blah blah blah")]
public string NameOfImage { get; set; }

しかし、私はどのようにわからないのですか?どんな助けでも大歓迎です

4

2 に答える 2

29

ValidationResult定義済みの文字列を返す代わりに、ErrorMessageプロパティまたはその他のカスタム プロパティを使用してみてください。例えば:

private const string DefaultFileNotFoundMessage = 
    "Sorry but there is already an image with this name please rename your image";

private const string DefaultErrorMessage = 
    "Please enter a name for your image";

public string FileNotFoundMessage { get; set; }

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    if (value!=null)
    {
        string fileName = value.ToString();
        if (FileExists(fileName))
        {
            return new ValidationResult(FileNotFoundMessage ??
                                        DefaultFileNotFoundMessage);
        }
        else
        {
            return ValidationResult.Success;
        }  
    }
    else
    {
        return new ValidationResult(ErrorMessage ?? 
                                    DefaultErrorMessage);
    }
}

そしてあなたの注釈で:

[ExistingFileName(FileNotFoundMessage = "Uh oh! Not Found!")]
public string NameOfImage { get; set; }

カスタム メッセージを明示的に設定しない場合は、カスタム属性の事前定義された定数にフォールバックします。

于 2013-07-04T16:34:47.727 に答える
10

から継承しましたValidationAttributeか?

その後、別の変数に保持する必要はありません。ValidationAttributeクラスから継承すると、すべてのエラー メッセージ コードを使用できます。

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class ExistingFileNameAttribute : ValidationAttribute
{
    public string FileFoundMessage = "Sorry but there is already an image with this name please rename your image";
    public ExistingFileNameAttribute()
        : base("Please enter a name for your image")
    {            
    }

    public override ValidationResult IsValid(object value)
    {
        if (value!=null)
        {
            string fileName = value.ToString();
            if (FileExists(fileName))
            {
                return new ValidationResult(FileFoundMessage);
            }
            else
            {
                return ValidationResult.Success;
            }  
        }
        else
        {
            return new ValidationResult(ErrorMessage);
        }
    }
}

これを使用して、フィールド/プロパティを検証できます

[ExistingFileName(ErrorMessage="Blah blah blah", FileFoundMessage = "Blah Bla")]
public string NameOfImage { get; set; }

以下のように使用する場合。

[ExistingFileName]
public string NameOfImage { get; set; }

次に、ExistingFileName属性のコンストラクターで設定されたデフォルトのエラー メッセージを使用します。

それが役立つことを願っています。

于 2013-07-04T19:30:59.483 に答える