我有以下工作系统并寻找使其干燥的方法:
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
控制器显然是用正确的内容初始化它们,在视图中,我运行了 ContactVMs 的 foreach 循环,每个联系人都有 TemplateEditor:EmailVM.cshtml、PhoneVM.cshtml、AddressVM.cshtml UrlVM.cshtml 等。
主视图看起来(省略所有设置和细节,如下所示:
@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)
...显然,我定义的每个视图模型都没有更多的编辑器模板。
所以简单来说 - 非常相似的联系人类型,在水印、命名、验证方面略有不同,但基本上所有字符串都具有相同的字段(地址是一个长字符串而不是结构,对所有这些都相同)。
我的问题不是针对水印的,它可以是任何属性——名称、描述、提示等。
[Display(Name="name", Description="description", Prompt="prompt")]
它几乎可以正常工作并显示正确的标签和水印,但这似乎是巨大的 DRY 违规,因为除了模型类型之外,所有模板编辑器都完全相同。我在这里展示的是简化以专注于手头的问题,主视图和编辑器模板比您在此处看到的要复杂得多,因此重复是巨大的。
你们中的任何人都可以提出更好的方法让它不重复这么多代码吗?
谢谢!