Есть ли автоматическая проверка на стороне сервера с asp.net mvc 3? - PullRequest
3 голосов
/ 31 августа 2011

У меня есть приложение asp.net mvc 3, и сейчас я пытаюсь добавить к нему некоторую проверку. Я тестирую с чистым решением. Я не хочу, чтобы проверка выполнялась на стороне клиента (пока), поэтому я отключил это в Web.config:

<add key="ClientValidationEnabled" value="false"/>

У меня есть простой класс, который реализует IValidatableObject, и я хочу использовать функцию проверки для проверки (не атрибуты).

public class SomeClass : IValidatableObject
{
    public int Id { get; set; }
    public int LowNumber { get; set; }
    public int HighNumber { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (LowNumber > HighNumber)
        {
            yield return new ValidationResult("LowNumber should not be higher than HighNumber.");
        }
    }
}

Теперь к вопросу. Применяется ли проверка на стороне сервера автоматически и как? Как мне это отключить? Я хочу контролировать это сам, говоря что-то подобное в своем посте:

[HttpPost]
public string SomeAction(SomeClass model)
{
    if (TryValidateModel(model))
        return "All good";
    else
        return "No good"; 
}

При этом проверка вызывается и отображается дважды. Один раз за этот звонок и один раз от кого-то еще. Кто?

Ответы [ 2 ]

3 голосов
/ 31 августа 2011

Если вы используете атрибуты проверки (или интерфейс IValidatableObject), тогда проверка на стороне сервера всегда будет выполняться, когда модель привязана с использованием подшивки модели.Если вы хотите переопределить проверку на стороне сервера, я полагаю, вам нужно создать свою собственную подшивку модели.

Немного полезной информации по теме здесь , а также отличная статья о подшивке и проверке.трубопровод здесь .

1 голос
/ 01 сентября 2011

Когда вы отправляете в действие контроллера с моделью в качестве параметра, ASP.NET MVC делает за вас некое волшебство, называемое привязкой модели.Каркас создает новый экземпляр модели и копирует входные данные формы в свойства модели.В ходе этого процесса он также запускает проверку аннотаций данных для вас, а объект IValidatableObject является частью аннотаций данных.

Таким образом, чтобы ответить на ваш вопрос, связыватель модели ASP.NET MVC по умолчанию выполняет проверку.Если вы не хотите, чтобы это происходило, не используйте атрибуты аннотаций данных или не реализуйте IValidatableObject.Просто создайте пользовательскую функцию для обработки проверки и вызовите эту функцию в вашем контроллере, хотя я не уверен, почему вы не хотите, чтобы проверка выполнялась автоматически во время привязки модели.В качестве альтернативы вы можете создать пользовательский механизм связывания модели, который не запускает проверку.

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