0

テーブルを保持することを目的としたモデルを作成しています。テーブルには、実行時に定義された任意の数の行が保持されます。これを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>

これは比較的理解できますか?すべての山かっことパーセント記号を使用したマークアップは嫌いですが、プロジェクトは代替構文を使用した開発者ではありません。

4

1 に答える 1

1

何か動的なものを求めているので、MVC WebGrid ヘルパーMvcContrib Gridなどの既存のヘルパーを利用できます。これらのヘルパーは、必要な列を含むテーブルを生成します。テーブルは、データソースに存在するオブジェクトの数に応じて実行時に動的に生成されるため、手動で記述する必要はありません。

于 2012-10-02T16:19:44.320 に答える