Делаем свою реализацию RemoteAttribute (asp.net-mvc)

В asp.net-mvc атрибут RemoteAttribute используется для того чтобы на клиенте удаленно проверять правильно ли пользователь ввел значение.  Это удобно, к примеру, когда нужно проверить существующий email или ник. Но недочет в том, что на самом сервере не производится повторная проверка после того, когда пользователь нажимает на кнопку submit. Исправим этот недочет.

  1. Наш класс:
    public class CustomRemoteAttribute : RemoteAttribute
    {
        private static List<Type> GetControllerList()
        {
            return Assembly.GetCallingAssembly().GetTypes().Where(type => 
            type.IsSubclassOf(typeof(Controller))).ToList();
        }
        protected CustomRemoteAttribute()
        {
        }
        public CustomRemoteAttribute(string routeName)
     : base(routeName)
        {
        }
        public CustomRemoteAttribute(string action, string controller)
     : base(action, controller)
        {
        }
        public CustomRemoteAttribute(string action, string controller, string areaName)
     : base(action, controller, areaName)
        {
        }
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var controller = GetControllerList().FirstOrDefault(x => x.Name == 
            string.Format("{0}Controller", this.RouteData["controller"]));
            if (controller == null)
            {
                return ValidationResult.Success;
            }
    
            var mi = controller.GetMethod(this.RouteData["action"].ToString());
            if (mi == null)
            {
                return ValidationResult.Success;
            }
    
            var instance = (ControllerBase)ControllerBuilder.Current.GetControllerFactory().
            CreateController(HttpContext.Current.Request.RequestContext, new Regex(@"Controller$").
            Replace(controller.Name, ""));
            instance.ControllerContext = new ControllerContext(new HttpContextWrapper
            (System.Web.HttpContext.Current), new RouteData(), instance);
    
            var result = (JsonResult)mi.Invoke(instance, new object[] { value });
    
            return (bool)result.Data ? ValidationResult.Success : new ValidationResult(base.ErrorMessageString);
        }
    }
    
  2. Используем так:
    [CustomRemote("ValidateUserName", "Account", null, ErrorMessage = "Такой ник занят")]
    public string UserName { get; set; }
    
По теме:
Выполняем get запрос по расписанию c#

Напишем простенькую программу, которая будет выполнять get запрос по истечению определенного интервала времени. class Program { private static Timer _timer; Read more

Выполняем действие по расписанию (asp.net, c#)

Раньше я писал программку, которая выполняла get запрос по расписанию, но так же можно написать обычный HttpModule, который будет делать Read more

Выбираем технологии и инструменты для разработки веб приложений

1 Выбор и настройка инструментов для разработки фронтенда (только самые важные): 1.1 Twitter bootstrap — фреймворк позволяет писать качественную верстку Read more

Делаем водяной знак на картинке (c#, .net)

Нанесем несколько раз картинку watermark на другую картинку. public void DrawWatermark(string watermarkImagePath, System.Drawing.Image image) { using (System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(watermarkImagePath)) Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *