我有一个基类,它继承了另一个基类的属性,并添加了一个新类,如下所示:
public class DataSourceWithIntervalBase : DataSourceBase
{
[MaxLength(100)]
[Display(Name = "Interval")]
public virtual string Interval1 { get; set; }
}
DataSourceBase
没有什么特别之处,它只需要一些允许用户编辑的属性。
DataSourceWithIntervalBase
进一步被其他类继承。除了用于UI的Display
属性外,它们都非常相似。
这是其中一个类,例如:
public class SqlServerDataSource : DataSourceWithIntervalBase
{
public SqlServerDataSource()
{
FeedType = FeedType.SqlServer;
}
[Required]
[MaxLength(500)]
[Display(Name = "Connection String")]
public override string Url { get; set; }
[MaxLength(100)]
[Display(Name = "Table Name")]
public override string Interval1 { get; set; }
}
你可以看到我在这里覆盖了2个属性。 Url
中找到的DataSourceBase
和Interval1
中找到的DataSourceWithIntervalBase
。
使用此继承时似乎没有什么破坏。它确实有效。但是,Display
属性不会被覆盖。 Url
的{{1}}实际上并没有,但即使在编辑器视图中使用它也不会被考虑在内。 DataSourceBase
属性标记为以下内容:
Interval1
那么如何强制我的继承类正确覆盖我的基类的Interval
属性呢?
答案 0 :(得分:0)
我不知道这是否是最佳做法,但它确实有效。
如果没有其他答案可以改进/规避这个解决方案,我会坚持这一点,并希望它能帮助其他人。
我对switch
视图模型的类型使用DataSource
语句,并使用适当的类型直接访问其DisplayAttribute
,如下所示:
@switch (Model.FeedType) // switch to cast correct Model Type in order to access proper DisplayAttribute for Interval1
{
case Model.FeedType.RSS:
break;
case Model.FeedType.XML:
@Html.LabelFor(m => ((XmlDataSource)m).Interval1)
break;
case Model.FeedType.SqlServer:
break;
case Model.FeedType.Excel2003:
@Html.LabelFor(m => ((Excel2003DataSource)m).Interval1)
break;
case Model.FeedType.InterLinkFeeder:
break;
case Model.FeedType.Atom:
break;
case Model.FeedType.Excel2007:
@Html.LabelFor(m => ((Excel2007DataSource)m).Interval1)
break;
case Model.FeedType.JSON:
@Html.LabelFor(m => ((JsonDataSource)m).Interval1)
break;
default:
break;
}
请记住,我跳过了各种类型,因为switch
语句位于EditorTemplate
中,不会用于这些类型。
您可以根据自己的具体情况轻松使用此解决方案。