Проверка MVC3 с помощью Lightspeed

Мой ORM (LightSpeed) генерирует это для таблицы животных с именем и возрастом. Использование MVC3 и Razor

   [Serializable]
  [System.CodeDom.Compiler.GeneratedCode("LightSpeedModelGenerator", "1.0.0.0")]
  [System.ComponentModel.DataObject]
  [Table(IdColumnName="AnimalID", IdentityMethod=IdentityMethod.IdentityColumn)]
  public partial class Animal : Entity<int>
  {     
    [ValidatePresence]
    [ValidateLength(0, 50)]
    private string _name;

    [ValidateComparison(ComparisonOperator.GreaterThan, 0)]
    private int _age;

    public const string NameField = "Name";
    public const string AgeField = "Age";

    [System.Diagnostics.DebuggerNonUserCode]
    [Required] // ****I put this in manually to get Name required working
    public string Name
    {
      get { return Get(ref _name, "Name"); }
      set { Set(ref _name, value, "Name"); }
    }

    [System.Diagnostics.DebuggerNonUserCode]
    public int Age
    {
      get { return Get(ref _age, "Age"); }
      set { Set(ref _age, value, "Age"); }
    }

С добавленным атрибутом [Обязательный]:

введите здесь описание изображения

Без добавленного атрибута [Required]: (обратите внимание на странную визуализацию проверки LightSpeed)

введите здесь описание изображения

С заполненным именем:

введите здесь описание изображения

На изображениях выше проверка вверху — это LightSpeed ​​(помещена в ValidationSummary), а сбоку — MVC3 (помещена в ValidationMessageFor).

В настоящее время я использую только проверку на стороне сервера.

Вопрос. Как добиться, чтобы проверка LightSpeed ​​хорошо работала в MVC3?

Я думаю, что это что-то в этой области http://www.mindscapehq.com/staff/jeremy/index.php/2009/03/aspnet-mvc-part4/

Для проверки на стороне сервера вам нужно будет использовать пользовательское связывание модели, которое более точно выдает ошибки проверки LightSpeed, а не использует поведение DefaultModelBinder. Взгляните на прямое использование или адаптацию EntityModelBinder из библиотеки кода сообщества для Mvc.

http://www.mindscapehq.com/forums/Thread.aspx?PostID=12051


person Dave Mateer    schedule 20.03.2011    source источник


Ответы (2)


См. ссылку http://www.mindscapehq.com/forums/Thread.aspx?ThreadID=4093

Ответ Джереми (у Mindscape отличная поддержка!)

public class EntityModelBinder2 : DefaultModelBinder
  {
    public static void Register(Assembly assembly)
    {
      ModelBinders.Binders.Add(typeof(Entity), new EntityModelBinder2());

      foreach (Type type in assembly.GetTypes())
      {
        if (typeof(Entity).IsAssignableFrom(type))
        {
          ModelBinders.Binders.Add(type, new EntityModelBinder2());
        }
      }
    }

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
      object result = base.BindModel(controllerContext, bindingContext);

      if (typeof(Entity).IsAssignableFrom(bindingContext.ModelType))
      {
        Entity entity = (Entity)result;

        if (!entity.IsValid)
        {
          foreach (var state in bindingContext.ModelState.Where(s => s.Value.Errors.Count > 0))
          {
            state.Value.Errors.Clear();
          }

          foreach (var error in entity.Errors)
          {
            if (error.ErrorMessage.EndsWith("is invalid")) continue;
            bindingContext.ModelState.AddModelError(error.PropertyName ?? "Custom", error.ErrorMessage);
          }
        }
      }

      return result;
    }
  }

и в Global.asax зарегистрируйтесь, используя:

EntityModelBinder2.Register(typeof(MyEntity).Assembly);

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

person Dave Mateer    schedule 21.03.2011

Вы можете получить проверку на стороне клиента, работающую с ночными сборками Lightspeed, начиная с 04.04.2011.

Создайте поставщика валидатора следующим образом:

public class LightspeedModelValidatorProvider : DataAnnotationsModelValidatorProvider
{
    private string GetDisplayName(string name)
    {
        return name; //  go whatever processing is required, eg decamelise, replace "_" with " " etc
    }

    protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
    {

        if(typeof(Entity).IsAssignableFrom(metadata.ContainerType))
        {
            List<Attribute> newAttributes = new List<Attribute>(attributes);
            var attr = DataAnnotationBuilder.GetDataAnnotations(metadata.ContainerType, metadata.PropertyName, GetDisplayName(metadata.PropertyName));
            newAttributes.AddRange(attr);

            return base.GetValidators(metadata, context, newAttributes);
        }

        return base.GetValidators(metadata, context, attributes);
    }
}

Затем в Application_Start() добавьте

        ModelValidatorProviders.Providers.Clear();
        ModelValidatorProviders.Providers.Add(new LightspeedModelValidatorProvider());
person SeanX    schedule 04.04.2011