如何为集合创建此EditorTemplate?

时间:2010-12-14 18:10:06

标签: c# .net asp.net-mvc asp.net-mvc-2

所以我有一个自定义ViewModel(CompanySalaryDataViewModel),其上有一组其他ViewModel(PersonalIncomeViewModel)。 最终,我希望为CompanySalaryDataViewModel设置一个EditorTemplate,它以某种方式使用PersonalIncomeViewModel的EditorTemplate,当它传递回我的POST时,它提供了对我的ViewModel的双向绑定控制器。

例如,让我们说它是这样的:

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. 每个“January”文本框都具有相同的名称(salary.JanIncome - 不包含任何区别于其他薪水的内容。每个月都有同样的问题。
  2. 也许是因为问题#1,当我发布时,这不会绑定回ViewModel - 我的AllSalaryData集合为空。
  3. 所有这些似乎都是非常好的练习,并且应该有更好的方法来做到这一点。
  4. 最终,我想我需要更好地理解使用带有集合的模板,但另一部分是将t-alt类正确应用于相应表行的“逻辑”。

    注意#1:我通过这种方式为我与这些文本框进行交互的一些javascript设置HTML ID。

    注意#2:我不是真的用薪水数据来做这件事。

2 个答案:

答案 0 :(得分:0)

您的问题不明确: 1.“ViewModels”是视图模型 - 至少从设计的角度来看。您是否打算能够“批量”更新集合/列表或您的帖子以发送相同对象类型的集合? 2.假设您的模型 - PersonalIncome [ViewModel]是可持久的。因此,您将在时间编辑一条记录,您将使用的编辑器模板将仅用于集合中的项目。

你能详细说明你不想做什么的意图 - 除了用文本框创建一个'列表'视图之外还有其他选择。

答案 1 :(得分:0)

好的,所以我找到了一个不太理想但功能正常的功能解决方案。显然foreach是问题但是for(var i=0; i < xxx.Count; i++)有效,因为索引号用于生成渲染控件的名称。不理想,但这很有效。