MVC 3简单继承
本文关键字:继承 简单 MVC | 更新日期: 2023-09-27 17:50:22
我遇到过一种情况,答案应该非常直截了当,但我却想不起来。
public class Note
{
#region Properties
public int Id { get; set; }
public int ClientId { get; set; }
public int CandidateId { get; set; }
public int TypeId { get; set; }
public DateTime DateCreated { get; set; }
public string UserId { get; set; }
public string UserName { get; set; }
public string Message { get; set; }
#endregion
#region Methods
public void Save()
{
}
#endregion
}
public class History : Note
{
}
如您所见,History继承了Note。它们完全相同,两者之间唯一的区别是类型Id。
当从数据库获取数据时,我有这个函数
public static Note Parse(SqlDataReader dr)
{
int TypeId = Convert.ToInt32(dr["TypeId"]);
Note Note;
if (TypeId == 1)
Note = new Note();
else
Note = new History();
Note.Id = Convert.ToInt32(dr["Id"]);
Note.TypeId = TypeId;
if (dr["ClientId"] != DBNull.Value) Note.ClientId = Convert.ToInt32(dr["ClientId"]);
if (dr["CandidateId"] != DBNull.Value) Note.CandidateId = Convert.ToInt32(dr["CandidateId"]);
Note.DateCreated = Convert.ToDateTime(dr["DateCreated"]);
Note.UserId = Convert.ToString(dr["UserId"]);
Note.UserName = Convert.ToString(dr["UserName"]);
Note.Message = Convert.ToString(dr["Message"]);
return Note;
}
然后在我的MVC页面我有这个:
<ol id="interview-comments">
@foreach (Note Note in Model.Notes().OfType<Note>())
{
}
</ol>
<ol id="history-comments">
@foreach (History Note in Model.Notes().OfType<History>())
{
}
</ol>
我的问题很简单。这是正确的做法吗?/r3plica
如果这就是整个情况,我不会在这里使用继承。你说Note和History条目有不同的TypeId:s.
那么我将执行以下操作:
@foreach(var item in Model.Notes().Where(x => x.TypeId == Note.NoteTypeId))
{
}
//and
@foreach(var item in Model.Notes().Where(x => x.TypeId == Note.HistoryTypeId))
{
}
public class Note
{
public static int HistoryTypeId = 1;
public static int NoteTypeId = 0;
/* ... the rest of the implementation */
}
您也可以将TypeId更改为enum并"隐藏"一些魔术数字
编辑:根据使用情况,您还可以将历史记录检查作为Note的属性来实现。
public class Note
{
/* ... other properties ... */
public bool IsHistoric { get { return this.TypeId != 1; } }
}
然后检查将是简单的
@foreach(var note in Model.Notes().Where(x => x.IsHistoric))
{
}
// and
@foreach(var note in Model.Notes().Where(x => !x.IsHistoric())
{
}
由于History
是Note
,您的Model.Notes().OfType<Note>()
也将包括History
实例-这是故意的吗?
你可能只想使用一个实体,并添加一个标志来判断它是否是一个注释;这将使它更清晰,并避免继承问题。
或者您可以使用公共接口或抽象基类,而不是让类从另一个继承,而是从同一个基类继承,这也将解决OfType
问题。
或者如果继承确实正确,那么像这样过滤:Model.Notes().Where(n => n.GetType()=typeof(Note))
,或者只是Model.Notes().Where(n => !(n is History))
-有很多方法可以到达罗马
我这里可能没有完整的图片,但我会考虑只使用一个类- Note
。在这个类上有一个属性,IsHistoric
。然后根据属性而不是类型进行检查。