私は次の作業システムを持っており、それを乾かす方法を探しています:
public class EMailMetaData
{
[Display(Prompt="myemail@mydomain.com"])
public string Data;
}
public class PhoneMetaData
{
[Display(Prompt="+1 (123) 456-7890"])
public string Data;
}
public class AddressMetaData
{
[Display(Prompt="Central st. W., St Francisco, USA"])
public string Data;
}
// 7 more metadata templates
public class ContactVM
{
[Required]
public string DataLabel { get; set; }
[Required(ErrorMessage="Please fill in the data field")]
public string Data { get; set; }
}
[MetadataType(typeof(EmailMetaData))]
EmailVM : ContactVM
{
}
[MetadataType(typeof(PhoneMetaData))]
PhoneVM : ContactVM
{
}
[MetadataType(typeof(AddressMetaData))]
AddressVM : ContactVM
{
}
// 7 more contact view models
Controllerは明らかに適切なコンテンツでそれらを初期化し、ビューでは、EmailVM.cshtml、PhoneVM.cshtml、AddressVM.cshtmlUrlVM.cshtmlなどのすべての連絡先に対してTemplateEditorを持つContactVMのforeachループを実行します。
メインビューは次のようになります(次のようなすべての設定と詳細は省略されています:
@model ContactsVM
foreach (var contact in Model.Contacts)
{
@Html.EditorFor(m => contact)
}
およびEditorTemplatesの下
@model EmailVM
@Html.EditorFor(model => model.DataLabel)
@Html.EditorFor(model => model.Data)
<br />
@Html.ValidationMessageFor(model => model.DataLabel)
@Html.ValidationMessageFor(model => model.Data)
...そして明らかに私が定義したすべてのビューモデル用のエディタテンプレートはもう少しあります。
つまり、簡単に言えば、透かし、命名、検証にわずかな違いがある非常に類似した連絡先タイプですが、基本的にすべての文字列とすべてが同じフィールドを持っています(アドレスは構造体ではなく1つの長い文字列であり、すべて同じです)。
私の質問は透かしに固有のものではなく、名前、説明、プロンプトなどの任意のプロパティにすることができます。
[Display(Name="name", Description="description", Prompt="prompt")]
すべてがほぼ機能し、それぞれに適切なラベルと透かしが表示されますが、モデルタイプを除いてすべてのテンプレートエディタがまったく同じであるため、DRY違反が非常に大きいようです。ここで示しているのは、目前の問題に集中するための簡略化です。メインビューとエディターテンプレートは、ここに表示されているものよりもはるかに複雑であるため、重複は非常に大きくなります。
それほど多くのコードを複製しないようにするためのより良い方法を提案できる人はいますか?
ありがとう!