Условный обязательный атрибут для проверки - PullRequest
2 голосов
/ 24 марта 2010

Мы пытаемся заставить условный атрибут работать, в данном случае есть логический (флажок), который, если установлен, требуется соответствующий текст Итак, в идеале у нас было бы что-то вроде ...

public bool Provision { get; set; }

[ConditionalRequirement(IsNeededWhenTrue = Provision)]
public string ProvisionText { get; set; }

Возможно ли это вообще?

Альтернативная идея (не так элегантно?)

    public bool Provision2 { get; set; }

    [PropertyRequired(RequiredBooleanPropertyName = "Provision2")]
    public string Provision2Text { get; set; }

Я бы не хотел использовать метод магической струны ... но есть ли другие идеи?

1 Ответ

0 голосов
/ 05 апреля 2010

Закончилось кататься самостоятельно. По сути, вы создаете метод оценки, который выполняет обычную проверку «да», «нет», что угодно и собирает их в какой-то сбор ошибок. Проблема с этим отправляет его обратно в саму модель. Так что я поленился и сильно набрал его как таковой ...

public static void AddError<T>(this ErrorCollection errorCollection, Expression<Func<T, object>> expression, string friendlyUiName)
{
    var propertyName = GetPropertyName(expression.ToString(), expression.Parameters[0].Name);
    var propertyInfo = typeof (T).GetProperty(propertyName);
    var resultError = DetermineOutput(friendlyUiName, propertyInfo.PropertyType);
    errorCollection.Errors.Add(new ValidationError(propertyName, resultError));
}

так что тогда в ваших утверждениях проверки есть что-то вроде этого ...

    if (FirstName.IsEmpty())
        EntityErrorCollection.AddError<SomeClass>(x => x.FirstName, "First Name");

Затем в контроллере просто проверьте и перенесите его НАЗАД на модель, если она (конечно, не действительна) ...

    foreach (var error in someObject.EntityErrorCollection.Errors)
         ModelState.AddModelError(error.Property, error.Message);

Возможно, есть более чистый способ сделать это, но до сих пор это работало просто отлично.

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