Я собираю приложение MVC, где я создал базовую модель, которая затем имеет четыре производных модели, каждая из которых наследуется от базовой модели:
public abstract class BaseFund
{
public string Name { get; set; }
public int AccountId { get; set; }
public abstract decimal Value { get; }
public virtual InvestmentAccount Account { get; set; }
}
одна из производных моделей:
public class ShareFund : BaseFund
{
public string ISIN { get; set; }
public ShareFundType FundType { get; set; }
public IncomeStatus IncomeStatus { get; set; }
public decimal TotalShares {
get
{
ICollection<ShareTransaction> tt = this.Transactions;
var outgoings = Transactions.Count > 0 ? Transactions.Where(t => t.TransactionType.IsOutgoing.Equals(true)).Sum(a => a.Units) : 0;
var incomings = Transactions.Count > 0 ? Transactions.Where(t => t.TransactionType.IsOutgoing.Equals(false)).Sum(a => a.Units) : 0;
return incomings - outgoings;
}
}
public override decimal Value
{
get
{
return this.TotalShares * (this.SharePrice / 100);
}
}
public decimal SharePrice { get; set; }
public ICollection<ShareTransaction> Transactions { get; set; }
}
И есть еще три аналогичные производные модели. Все модели являются POCO, используемыми Entity Framework.
РЕДАКТИРОВАТЬ: на данном этапе представление является стандартным материалом строительных лесов MVC:
<table>
<tr>
<th>
Name
</th>
<th>
Account
</th>
<th>
Value
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Account.AccountNumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.Value)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
</td>
</tr>
}
</table>
То, что я хочу сделать, - это создать представление, отображающее поля из базового фонда (имя, идентификатор учетной записи и значение). Проблема заключается в том, что логика, определяющая значение, различна для каждой производной модели - в случае ShareFund она использует TotalShares, поэтому базовый фонд, используемый в представлении, должен быть приведен к типу ShareFund. Другие производные модели не обязательно имеют TotalShares как свойство.
Имея это в виду:
- Является ли использование наследования с моделями таким способом? Если да, то как получить поля, относящиеся к производным моделям в представлении?
- Если использование наследования не рекомендуется для этого типа сценария, что я должен использовать вместо него?
Спасибо