TryValidateProperty не работает с универсальной функцией - PullRequest
1 голос
/ 06 января 2012

ОБНОВЛЕНО: когда я выполняю проект модульного теста, а затем он возвращает Был необработан Этот результат теста также содержал внутреннее исключение вместо"Ошибка Assert.IsTrue. Поле описания равнотребуется."Результат похож на (0 Pass, 1 FAIL, 1 Total), но мы вообще не получаем никаких исключений, если я отлаживаю с помощью F11

    [TestMethod]
    [Asynchronous]
    [Description("Determines whether the selected or single property is valide using the validation context or validate single properties.")]
    public void ValidateSigleWithDataAnnotation()
    {
        LookupsServices lookupsservices = new LookupsServices();
        Lookups lookups = new Lookups() { Description = "", LookupReference = 2, DisplayOrder = 50};
        lookupsservices.Lookups.Add(lookups);

        //THIS IS NOT WORKING
        string message = ValidateProperties.ValidateSingle(lookups, "Description");
        Assert.IsTrue(message.Equals(""), message);
        //THIS IS WORKING
        var results = new List<ValidationResult>();
        Validator.TryValidateProperty(lookups.Description , new ValidationContext(lookups, null, null) { MemberName = "Description" }, results);
        Assert.IsTrue(results.Count == 0, results[0].ToString());
    }

Ниже приведена общая функция для проверки отдельного свойства

    public static string ValidateSingle<T>(T t, string PeropertyName) where T : class
    {
        string errorMessage = "";
        var ValidationMessages = new List<ValidationResult>();
        bool ValidationResult = Validator.TryValidateProperty(typeof(T).GetProperty(PeropertyName).Name,  new ValidationContext(t, null, null) { MemberName =  PeropertyName} , ValidationMessages);

        if (!ValidationResult) errorMessage += string.Format("\n{0}", ValidationMessages[0]);
        return errorMessage;
    }

Ниже приведена модель, где требуется идентификатор поля Описание

public class Lookups
{
    public Lookups() { }
    [Key]
    public virtual int LookupReference { get; set; }
    [Required]
    public virtual string Description { get; set; }
    public virtual int? DisplayOrder { get; set; }
}

Я получаю сообщение об ошибке «Поле описания обязательно», если я проверяю без универсального метода, но почему не получаю ту же ошибку с использованием универсального метода?

Пожалуйста, помогите мне .....

1 Ответ

7 голосов
/ 06 января 2012

Сравните эти два вызова:

// In the generic method
Validator.TryValidateProperty(
    typeof(T).GetProperty(PeropertyName).Name, 
    new ValidationContext(t, null, null) { MemberName =  PeropertyName},
    ValidationMessages);

// The working call
Validator.TryValidateProperty(
    lookups.Description,
    new ValidationContext(lookups, null, null) { MemberName = "Description" },
    results);

В первой форме вы передаете имя свойства , то есть "Описание".Во второй форме вы передаете значение свойства, т.е. "".Чтобы первый вызов выглядел как второй, вам понадобится:

typeof(T).GetProperty(PeropertyName).GetValue(t, null), 

Мне не совсем понятно, хотите ли вы этого (я сам не использовал Validator), но это может быть ответом.

...