Как бы я создал этот EditorTemplate для коллекции? - PullRequest
0 голосов
/ 14 декабря 2010

Итак, у меня есть пользовательская 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>

Проблемы с этим кодом:

  1. Каждое текстовое поле «Январь» имеет то же имя (salary.JanIncome - не содержит ничего, чтобы отличить его от другой зарплаты).Та же проблема с каждым месяцем.
  2. Возможно, из-за проблемы # 1, это не привязывает к ViewModel при публикации - моя коллекция AllSalaryData равна нулю.
  3. Все это кажетсяОЧЕНЬ не лучшая практика, и вроде бы должен быть лучший способ сделать это.

В конечном счете, я думаю, что мне нужно лучше понять использование шаблонов с коллекциями, но другая часть этого - "логика""для правильного применения класса t-alt к соответствующей строке таблицы.

ПРИМЕЧАНИЕ # 1: Я устанавливаю HTML-идентификаторы таким образом для некоторых вещей javascript, с которыми я взаимодействую с этими текстовыми полями.

ПРИМЕЧАНИЕ# 2: Я на самом деле не делаю это с данными о зарплате.

Ответы [ 2 ]

0 голосов
/ 02 января 2011

Хорошо, я нашел функциональное решение, которое не идеально, но работает.Очевидно, foreach является проблемой, но for(var i=0; i < xxx.Count; i++) работает, потому что индексный номер используется для генерации имени отображаемого элемента управления.Не идеально, но это прекрасно работает.

0 голосов
/ 14 декабря 2010

Непонятно с вашим вопросом: 1. «ViewModels» - это модели представлений - по крайней мере, с точки зрения дизайна.Вы намерены иметь возможность «пакетно» обновить коллекцию / список или ваше сообщение обратно, чтобы отправить коллекцию того же типа объекта?2. Давайте предположим, что ваша модель - PersonalIncome [ViewModel] является устойчивой.Таким образом, вы будете редактировать одну запись за раз, и шаблон редактора, который вы будете использовать, будет предназначен только для элемента в коллекции.другие альтернативы, кроме создания представления списка с помощью текстовых полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...