私は、ASP.NET MVC 3 用の小さなライブラリに取り組んでいます。これにより、モデル メタデータの再利用性が向上し、データ エンティティからカスタム ビューモデルへのマッピングが容易になります。このためには、ASP.NET MVC の 3 つの異なる関心領域に対して ICustomTypeDescriptor の独自の実装を提供できる必要があります。
- 足場
- 検証
- モデルバインディング
System.Web.Mvc.ModelMetadataProviders.Currentこれは、独自の CustomMetaDataProvider に設定することで実行できるようです が、上記の 3 つのポイントすべてをカバーするには、これでは十分ではありません。
問題は、System.Web.Mvc にいくつかのクラスがあり、これを直接呼び出すことSystem.Web.TypeDescriptorHelperです。これは次のようになるため、拡張できません。
internal static class TypeDescriptorHelper {
public static ICustomTypeDescriptor Get(Type type) {
return new AssociatedMetadataTypeTypeDescriptionProvider(type).GetTypeDescriptor(type);
}
}
私が見つけた唯一の解決策は非常に扱いにくく、それを機能させるには System.Web.Mvc から多くの型をサブクラス化する必要がありました。CustomModelBinderDictionary1 ~ 2 行のコードを上書きするためだけに、完全に再実装する必要さえありました。したがって、機能しますが、非常に厄介なハックであり、次に新しい ASP.NET MVC バージョンに更新するときに壊れる可能性があります。
だからここに私が知りたいことがあります:これを行う簡単な方法を見逃しましたか?
おまけの質問: MVC チームのメンバーでなく、MVC 4 で適切な拡張ポイントを作成することを検討していただけないでしょうか ;-)?
編集:独自の TypeDescriptor をコーディングする必要がある理由の質問への回答: これにはいくつかの理由があります: 1. 最も重要: https://forums.asp.net/t/1614439で説明されている問題の回避策が必要です.aspx/1 2. また、さまざまな理由からメタデータを動的に挿入する必要があります。たとえば、独自の Bind 属性をコーディングしたいのですが、BindAttribute はシールされています。したがって、そこから派生するのではなく、独自のバインド属性の実装を検出するときに、一致する BindAttribute を TypeDescriptor から動的に発行しています。