Итак, у меня есть пользовательская ViewModel (CompanySalaryDataViewModel
), в которой есть коллекция других ViewModel (PersonalIncomeViewModel
). В конечном счете, я хочу иметь EditorTemplate для CompanySalaryDataViewModel
, который каким-то образом использует EditorTemplate для PersonalIncomeViewModel
таким образом, что он обеспечивает двухстороннюю привязку к моей ViewModel при передаче обратно в мой POST-контроллер.
Например, скажем, что-то вроде этого:
public class CompanySalaryDataViewModel
{
string CompanyName { get; set; }
IList<PersonalIncomeViewModel> AllSalaryData { get; set; }
}
public class PersonalIncomeViewModel
{
long UniqueID { get; set; }
string PersonName { get; set; }
int JanIncome { get; set; }
int FebIncome { get; set; }
int MarIncome { get; set; }
int AprIncome { get; set; }
int MayIncome { get; set; }
int JunIncome { get; set; }
int JulIncome { get; set; }
int AugIncome { get; set; }
int SepIncome { get; set; }
int OctIncome { get; set; }
int NovIncome { get; set; }
int DecIncome { get; set; }
}
Я хочу, чтобы это было сделано так, чтобы это было похоже на следующую разметку, но работает:
<%= Html.TextBoxFor(x => x.CompanyName) %>
<table cellspacing="0">
<thead>
<tr class="t-grid-header">
<th class="t-header">ID</th>
<th class="t-header">Person</th>
<th class="t-header">Jan</th>
<th class="t-header">Feb</th>
<th class="t-header">Mar</th>
<th class="t-header">Apr</th>
<th class="t-header">May</th>
<th class="t-header">Jun</th>
<th class="t-header">Jul</th>
<th class="t-header">Aug</th>
<th class="t-header">Sep</th>
<th class="t-header">Oct</th>
<th class="t-header">Nov</th>
<th class="t-header">Dec</th>
</tr>
</thead>
<%
var isAlt = false;
foreach (var salaryData in Model.AllSalaryData)
{
var salary = salaryData;
if (isAlt)
{%>
<tr class="t-alt">
<%
}
else
{%>
<tr>
<%
}
isAlt = !isAlt;
%>
<td><%=Html.TextBoxFor(x => salary.UniqueID)%></td>
<td><%=Html.TextBoxFor(x => salary.PersonName)%></td>
<td><%=Html.TextBoxFor(x => salary.JanIncome, new {id = salary.PersonName + "_1", style = "width: 45px;"})%></td>
<td><%=Html.TextBoxFor(x => salary.FebIncome, new {id = salary.PersonName + "_2", style = "width: 45px;"})%></td>
<td><%=Html.TextBoxFor(x => salary.MarIncome, new {id = salary.PersonName + "_3", style = "width: 45px;"})%></td>
<td><%=Html.TextBoxFor(x => salary.AprIncome, new {id = salary.PersonName + "_4", style = "width: 45px;"})%></td>
<td><%=Html.TextBoxFor(x => salary.MayIncome, new {id = salary.PersonName + "_5", style = "width: 45px;"})%></td>
<td><%=Html.TextBoxFor(x => salary.JunIncome, new {id = salary.PersonName + "_6", style = "width: 45px;"})%></td>
<td><%=Html.TextBoxFor(x => salary.JulIncome, new {id = salary.PersonName + "_7", style = "width: 45px;"})%></td>
<td><%=Html.TextBoxFor(x => salary.AugIncome, new {id = salary.PersonName + "_8", style = "width: 45px;"})%></td>
<td><%=Html.TextBoxFor(x => salary.SepIncome, new {id = salary.PersonName + "_9", style = "width: 45px;"})%></td>
<td><%=Html.TextBoxFor(x => salary.OctIncome, new {id = salary.PersonName + "_10", style = "width: 45px;"})%></td>
<td><%=Html.TextBoxFor(x => salary.NovIncome, new {id = salary.PersonName + "_11", style = "width: 45px;"})%></td>
<td><%=Html.TextBoxFor(x => salary.DecIncome, new {id = salary.PersonName + "_12", style = "width: 45px;"})%></td>
</tr>
<%
}%>
</table>
Проблемы с этим кодом:
- Каждое текстовое поле «Январь» имеет то же имя (
salary.JanIncome
- не содержит ничего, чтобы отличить его от другой зарплаты).Та же проблема с каждым месяцем. - Возможно, из-за проблемы # 1, это не привязывает к ViewModel при публикации - моя коллекция
AllSalaryData
равна нулю. - Все это кажетсяОЧЕНЬ не лучшая практика, и вроде бы должен быть лучший способ сделать это.
В конечном счете, я думаю, что мне нужно лучше понять использование шаблонов с коллекциями, но другая часть этого - "логика""для правильного применения класса t-alt
к соответствующей строке таблицы.
ПРИМЕЧАНИЕ # 1: Я устанавливаю HTML-идентификаторы таким образом для некоторых вещей javascript, с которыми я взаимодействую с этими текстовыми полями.
ПРИМЕЧАНИЕ# 2: Я на самом деле не делаю это с данными о зарплате.