2

これが現在どのように機能するかのサンプルです:

[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 クラスにあります」と伝える何らかの方法が必要です。

メタデータで「拡張」するために Person クラスに触れる必要がないため、私にとってより構成的であると感じる方向を逆にし、Open-Close Principle に従っているだけです。
これにより、複数の競合するメタデータが添付される可能性があり、複雑さが増しますが、柔軟性には常に代償が伴います。

プログラムによる方法または宣言的な方法、またはできれば両方が必要です:)

したがって、次のようなものになる可能性があります。

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; }
}
4

1 に答える 1

3

私はMvcExtensionsを使用しています。機能の 1 つは、次のようなメタデータを記述する優れた方法です。

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);
  }
}

きちんとしたことは、これにより、強く型付けされた方法でローカリゼーションにリソースを使用できるようになることです。

これを使用することの欠点 - 使用したくない他のものがたくさんバンドルされています。

于 2010-09-28T11:26:20.690 に答える