2

我有一个基类,它从另一个基类继承属性,并添加一个新基类,如下所示:

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属性不会被覆盖。UrlofDataSourceBase实际上没有,但即使在编辑器视图中使用时也没有考虑到它。该Interval1属性被标记如下:

Interval

那么如何强制我的继承类正确覆盖Display我的基类的属性呢?

4

1 回答 1

0

我不知道这是否是最佳做法,但它确实有效。

如果没有其他答案可以改进/规避这个解决方案,我会坚持这个,并希望它对其他人有所帮助。

我使用了switch关于DataSourceView Models 类型的语句并转换了适当的类型以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不会用于这些类型的语句中。

您可以轻松地根据您的特定情况使用此解决方案。

于 2013-09-09T16:54:39.907 回答