Я пытаюсь найти лучший способ проверить данные в приложении MVC С#, и xVal, по-видимому, наилучшим образом подходит. Однако я столкнулся с проблемой проверки данных.
Сначала я делал UpdateModel в DTO, а затем выполнял проверку на DTO. Это отлично работает для таких вещей, как обязательные поля, однако UpdateModel генерирует исключение, если вы попытаетесь, например, сопоставить строку ( "asd" ) в десятичное поле. Поскольку UpdateModel должен был быть запущен до того, как были данные для проверки, я не был уверен, как обойти это.
Мое решение состояло в том, чтобы создать DTO для каждой формы, которую будет обновлять UpdateModel, запустить проверку на ней и затем скопировать значения в соответствующие DTO. Все атрибуты в форме DTO были бы строками, поэтому UpdateModel никогда не будет выходить из строя, и я бы обеспечил проверку данных через xVal. Однако, несмотря на то, что правила, подобные обязательным, пинаются, я не могу заставить правило DataType использовать (в этом случае попробовать DataType.Currency).
Я также попытался заставить проверку на стороне клиента работать, но я надеялся, что существует чистый способ проверки на стороне сервера типов данных.
Что делали другие в отношении проверки типов данных на стороне сервера?
В результате я создал несколько DTO, которые представляют формы. Эти DTO будут принимать Request.Form и автоматически отображать все значения формы во внутренние свойства (ex public string email, public string firstname), на основе которых они имеют то же имя, что и значения формы.
Они будут иметь все свойства строки, и я бы поместил на них атрибуты xVal. Затем я использовал xVal и регулярные выражения, чтобы убедиться, что данные вступили в силу (с допустимой даты, электронной почты, номера и т.д.). Таким образом, никогда не будет исключение, потому что оно всегда вписывается в строку, а не в .Net, пытаясь разобрать ее на дату или что-то в этом роде.
Это позволит убедиться, что данные всегда делали его в xVal, где я мог выполнить проверку, которую я хочу, а затем преобразовать в соответствующий тип, например DateTime, как только я знаю, что у меня есть достоверные данные.
Я использую настраиваемые валидаторы, полученные из ValidationAttribute, для проверки данных, которые должны анализироваться на стороне сервера из строки в другие типы данных. Например:
public class DateAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
var date = (string)value;
DateTime result;
return DateTime.TryParse(date, out result);
}
}
Я также нашел способ включить такие атрибуты проверки в атрибуты проверки на стороне клиента и на стороне сервера без написания какого-либо пользовательского кода JavaScript. Я просто должен получить из другого базового класса атрибута проверки. Посмотрите на мою статью статью о проверке на стороне клиента, если вы хотите узнать об этом подробнее.