пятница, 18 марта 2016 г.

Фильтр request модели. Web API


На днях возникла задача на проверку входных данных от пользователей: запретить отступы у  строковых данных в начале и в конце. Модель большая, делать у каждого свойства типа string что-то в стиле 

Name=model.Name.IfNotNull(x=>x.Trim())  

не хотелось. По этому пришлось поискать в интернете. Наткнулась на фильтр, который переписывает  request модель в web-api-добавляет определенный данные, причем сам тип модели не известен. Немного переделав код, получился вот такой фильтр: 

 public class TrimFieldFilterAttribute : ActionFilterAttribute
 {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            foreach (var keyValuePair in actionContext.ActionArguments)
            {
                var model = actionContext.ActionArguments[keyValuePair.Key];
                if (model == null)
                    continue;


                var properties = model.GetType().GetProperties();
                for (int index = 0; index < properties.Length; index++)
                {
                    var property = properties[index];
                    var yui = property.GetValue(model, null) as string;
                    if (yui == null) continue;

                    property.SetValue(model, yui.Trim(), null);
                }
            }
        }
    }

Его также можно подключить к любому методу. Он вытягивает при помощи System.Reflection значения типа string у любой request модели, и уже вызывает метод Trim().

На стороне клиента можно так же запрещать ввод пробела в начале и в конце.
Долго думать не пришлось: на проекте почти везде у элементов input type="text" один класс. На него можно повесить событие focusout, которое так же будет вызывать метод trim()+нет ошибок если не ввели данные.

Комментариев нет:

Отправить комментарий