Проверка типа данных с помощью xVal - PullRequest
2 голосов
/ 31 августа 2009

Я пытаюсь найти лучший способ проверки данных в приложении MVC C #, и xVal, похоже, подходит лучше всего. Однако у меня возникла проблема с проверкой типа данных.

Сначала я делал UpdateModel в DTO, а затем запускал проверку в DTO. Это отлично работает для таких вещей, как обязательные поля, однако UpdateModel выдаст исключение, если вы попытаетесь, например, отобразить строку («asd») в десятичное поле. Поскольку UpdateModel нужно было запустить до того, как появились какие-либо данные для проверки, я не был уверен, как обойти это.

Мое решение состояло в том, чтобы создать DTO для каждой формы, в которую UpdateModel будет копировать, выполнить проверку на этом, а затем скопировать значения в соответствующие DTO. Все атрибуты в форме DTO будут строками, поэтому UpdateModel никогда не сработает, и я бы принудительно проверил данные через xVal. Однако, несмотря на то, что включаются правила, подобные обязательным, я не могу заставить правило DataType включиться (в данном случае, пытаясь использовать DataType.Currency).

Я также пытался заставить проверку на стороне клиента работать, но я надеялся, что существует чистый способ выполнить проверку типов данных на стороне сервера.

Что сделали другие в отношении проверки типов данных на стороне сервера?

Ответы [ 2 ]

2 голосов
/ 07 января 2010

В итоге я создал несколько DTO, которые представляют формы. Эти DTO будут принимать Request.Form и автоматически отображать все значения формы во внутренние свойства (например, электронная почта с общедоступной строкой, имя с общедоступной строкой), исходя из того, что они совпадают с именами форм.

У них будут все строковые свойства, и я добавлю к ним атрибуты xVal. Затем я бы использовал xVal и регулярные выражения, чтобы убедиться, что поступающие данные были действительными (например, действительная дата, адрес электронной почты, номер и т. Д.). Таким образом, никогда не будет выброшено исключение, потому что оно всегда входит в строку, в отличие от .Net, пытающегося разобрать его в дату или что-то в этом роде.

Это позволит убедиться, что данные всегда попадают в xVal, где я могу выполнить требуемую проверку, и затем преобразует их в соответствующий тип, например DateTime, как только я узнаю, что у меня есть действительные данные.

1 голос
/ 02 сентября 2009

Я использую пользовательские валидаторы, полученные из ValidationAttribute, для проверки данных, которые должны быть проанализированы на стороне сервера от строки до других типов данных. Например:

public class DateAttribute : ValidationAttribute
    {

        public override bool IsValid(object value)
        {
            var date = (string)value;
            DateTime result;
            return DateTime.TryParse(date, out result);
        }
    }

Я также нашел способ превратить такие атрибуты проверки в атрибуты проверки на стороне клиента и на стороне сервера без написания какого-либо пользовательского кода JavaScript. Мне просто нужно извлечь из другого базового класса атрибута проверки. Взгляните на мою статью в блоге о проверке на стороне клиента , если вы хотите узнать больше об этом.

...