创建一个具有任意行数的表作为我的模型?

时间:2012-10-02 16:14:13

标签: c# asp.net-mvc model-view-controller

我正在创建一个用于保存表格的模型。该表将包含在运行时定义的任意数量的行。我想知道在MVC中是否有一种简单的方法来定义它?

目前我只有:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CableSolve.Web.Models.Orders.ActivityDetailsModel>" %>

<div id="ActivityDisplay">
    <table id="ActivitiesGrid">
    </table>
    <div id="ActivitiesGridPager"></div>
</div>

在另一个模型中,我创建了一个具有静态行数的表。这很简单:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CableSolve.Web.Models.Orders.OrderDetailsModel>" %>

<fieldset class="collapsible">
    <legend>
        <%= Html.DisplayFor(model => model.OrderDetailsLegendName)%>
    </legend>
    <table id="OrderDetailsContentTable" class="ContentTable">
        <tr>
            <td><%= Html.DisplayFor(model => model.OrderID.Name)%></td>
            <td><%= Html.DisplayFor(model => model.OrderID.Value)%></td>

            <td><%= Html.DisplayFor(model => model.Comment.Name)%></td>
            <td><%= Html.DisplayFor(model => model.Comment.Value)%></td>
        </tr>
        ...

那么,关于如何在ActivitiesGrid中拥有任意数量的行的任何想法?

基本上,我的控制器将在运行时获取一些信息,我想在表中显示检索到的信息,但我不知道我将接收多少行信息。

作为一种轻量级的解决方案,不引入第三方的东西(现在,如果证明有必要,我会):

public class ActivityDetailsModel
{
    public List<ActivityRow> ActivityRows = new List<ActivityRow>();

    public struct ActivityRow
    {
        public DateTime? Date;
        public string Person;
        public string OrderOrTaskID;
        public string Activity;

        public ActivityRow(DateTime? date, string person, string orderOrTaskID, string activity)
        {
            Date = date;
            Person = person;
            OrderOrTaskID = orderOrTaskID;
            Activity = activity;
        }
    }

    public ActivityDetailsModel(IEnumerable<Activity> activities)
    {
        foreach(Activity activity in activities)
        {
            string orderOrTaskID = activity.TaskID != 0
                                     ? activity.OrderID + "-" + activity.TaskID
                                     : activity.OrderID.ToString();

            string activityDescription = string.Format("OldValue: {0}, NewValue: {1}", activity.OldValue,
                                                       activity.NewValue);

            ActivityRows.Add(new ActivityRow(activity.UpdateDateTime, activity.UpdateUsername, orderOrTaskID, activityDescription));
        }
    }
}

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CableSolve.Web.Models.Orders.ActivityDetailsModel>" %>

<div id="ActivityDisplay">
    <table id="ActivitiesGrid">
        <%foreach (var activityRow in Model.ActivityRows)
          {%>
            <tr>
                <td><%= Html.DisplayForModel(activityRow.Date)%></td>
                <td><%= Html.DisplayForModel(activityRow.Person)%></td>
                <td><%= Html.DisplayForModel(activityRow.OrderOrTaskID)%></td>
                <td><%= Html.DisplayForModel(activityRow.Activity)%></td>
            </tr>
          <%}%>
    </table>
    <div id="ActivitiesGridPager"></div>
</div>

这是相对可以理解的吗?我讨厌所有尖括号和百分号的标记,但该项目并不是开发人员的替代语法。

1 个答案:

答案 0 :(得分:1)

由于您处理的是动态内容,因此您可以利用现有的帮助程序,例如MVC WebGrid helper甚至MvcContrib Grid。这些帮助程序将负责生成包含所需列的表。没有必要手动编写表,因为它将在运行时根据数据源中存在的对象数量动态生成。