Есть ли способ проинструктировать ASP.NET MVC о некоторых метаданных класса, кроме помещения атрибута MetadataTypeAttribute непосредственно в класс? - PullRequest
2 голосов
/ 28 сентября 2010

Вот пример того, как это работает сейчас:

[MetadataType(typeof(PersonMetadata))]
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class PersonMetadata
{
    [Required]
    public string Name { get; set; }
    [Range(0,150]
    public int Age { get; set; }
}

Однако я не хочу, чтобы атрибут MetadataAttribute помещался в класс Person, вместо этого я хочу как-то сказать структуре MVC: "Эй, если вы встретите класс Person, метадат находится в классе PersonMetadata".

Это просто изменение направления, которое для меня кажется более композиционным, и я следую принципу Open-Close, поскольку мне не нужно прикасаться к классу Person, чтобы «расширять» его метаданными.
Я знаю, что это создает проблему возможного присоединения нескольких и противоречивых метаданных, а также увеличивает сложность, но гибкость всегда имеет свою цену.

Я хочу либо программным, либо декларативным способом, либо желательно и тем и другим:)

Так что может быть что-то вроде:

MetadataTypeMappings.Add(typeof(Person), typeof(PersonMetadata));

Другое может быть:

[MetadataFor(typeof(Person)]
public class PersonMetadata
{
    [Required]
    public string Name { get; set; }
    [Range(0,150]
    public int Age { get; set; }
}

1 Ответ

3 голосов
/ 28 сентября 2010

Я использую MvcExtensions . Одна из функций - это хороший способ описать метаданные следующим образом:

public class ProductEditModelConfiguration : 
  ModelMetadataConfiguration<ProductEditModel>
{
  public ProductEditModelConfiguration()
  {
    Configure(model => model.Id).Hide();
    Configure(model => model.Name)
      .DisplayName(() => LocalizedTexts.Name)
      .Required(() => LocalizedTexts.NameCannotBeBlank)
      .MaximumLength(64, () => 
        LocalizedTexts.NameCannotBeMoreThanSixtyFourCharacters);
  }
}

Отличная вещь - это позволяет использовать ресурсы для локализации строго типизированным способом.

Недостаток использования этого - есть куча других вещей, которые Вы, возможно, не захотите использовать.

...