Несколько пользовательских атрибутов проверки для класса MVC - PullRequest
4 голосов
/ 24 февраля 2010

Я создаю пример для лучшего понимания.

[CustomValidator("Property1","Property2", ErrorMessage= "Error1")]
[CustomValidator("Property3","Property4", ErrorMessage= "Error1")]
public class MyViewModel
{
    public string Property1 {get; set;}
    public string Property2 {get; set;}
    public string Property3 {get; set;}
    public string Property4 {get; set;}
}

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
public class CustomValidator : ValidationAttribute
{
    All the required stuff is written.
}

Только второй валидатор (или последний в списке) запускается и игнорирует первый. Я не уверен, что это правильный подход для этого сценария. Есть предложения?

Ответы [ 4 ]

1 голос
/ 17 июня 2011

Я нашел другой вопрос, который отвечает на это. Вы должны переопределить Attribute.TypeId .

Пользовательский атрибут проверки с проблемой нескольких экземпляров

1 голос
/ 24 февраля 2010

если вы используете Linq to SQL, почему бы не попробовать что-то подобное

добавить класс нарушений правил для обработки нарушений правил

public class RuleViolation
{
    public string ErrorMessage { get; private set; }
    public string PropertyName { get; private set; }
    public RuleViolation(string errorMessage)
    {
        ErrorMessage = errorMessage;
    }
    public RuleViolation(string errorMessage, string propertyName)
    {
        ErrorMessage = errorMessage;
        PropertyName = propertyName;
    }
}

теперь в вашем классе данных

[Bind(Exclude="ID")]
public partial class Something
{
    public bool IsValid
    {
        get { return (GetRuleViolations().Count() == 0); }
    }

    public IEnumerable<RuleViolation> GetRuleViolations()
    {
        if (String.IsNullOrEmpty(Name.Trim()))
            yield return new RuleViolation("Name Required", "Name");
        if (String.IsNullOrEmpty(LocationID.ToString().Trim()))
            yield return new RuleViolation("Location Required", "LocationID");
        yield break;
    }

    partial void OnValidate(ChangeAction action)
    {
        if (!IsValid)
            throw new ApplicationException("Rule violations prevent saving");
    }

}

и в методах обновления вашего контроллера используйте метод updatemodel для изменения свойств

Something something = somethingRepo.GetSomething(id);
try
{
    //update something
    UpdateModel(something);
    somethingRepo.Save();
    return RedirectToAction("Index");
}
catch
{
    ModelState.AddRuleViolations(something.GetRuleViolations());
    return View(something);
}

таким образом, вы можете просто добавлять правила к вашему классу данных по мере его изменения, что будет отражаться в ваших обновлениях и т. Д.

0 голосов
/ 05 мая 2011

У меня была такая же проблема.

Я придумаю следующее решение.

Ваш класс POCO может реализовывать интерфейс IValidatableObject.

Это требует от вас реализации следующего метода.

    public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        // return list of appropriate ValidationResult object            
        var customResult = new List<ValidationResult>();
        customResult.Add(new ValidationResult("message", new List<string>(){"Property1"});
    }

Вы можете разместить здесь любую логику проверки. Это также имеет преимущество перед атрибутом уровня класса. Атрибут уровня класса может быть показан только в ValidationSummary (они не связаны с каким-либо свойством). В отличие от этого вы можете установить конкретные члены при возврате ValidationResult. Это позволяет отображать информацию проверки помимо конкретного элемента управления, к которому относится сообщение.

0 голосов
/ 24 февраля 2010

вам не нужно, чтобы весь этот код использовал аннотации данных, создав класс метаданных для вашей модели текст ссылки

, который должен направить вас в нужное русло, также читать html-помощники и классы друзей (это то, что они называют em)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...