0

ここではMVC4を使用しており、XMLファイルから生成されたアクティビティのリストのページがあります。複数のアクティビティをチェックでき、各アクティビティ内でユーザーは日付、大人/子供の数を設定できます。私の計画では、ユーザーが[送信]をクリックすると、チェックされたすべてのアクティビティがActivityItemのリストに入れられます。これが私がActivityItemを定義したものです:

ActivityItemクラス

public class ActivityItem
{
    public string ActivityID { get; set; }
    public string Name { get; set; }
    public string Date { get; set; }
    public int NumAdults { get; set; }
    public int NumChildren { get; set; }
    public decimal TotalPrice { get; set; }
}

私のビューは次のようになります(コードを読みやすくするために、多くのスタイルとフォーマットを削除しました)。@ item.ActivityIDは、「ACT001」、「ACT002」、「ACT003」の順に始まり、n回まで続くことに注意してください。

@model IEnumerable<Project.Models.Activity>

@using (Html.BeginForm())
{
<ul data-role="listview" data-inset="true">
@foreach (var item in Model)
{
    <li>
        <div class="activity" id="@item.ActivityID">
            <h3>@item.Name</h3>
            <input type="checkbox" id="@item.ActivityID-Check" name="checkbox"/>  

        <label for="select-choice-0" class="select">Date:</label>
        <select name="select-choice-0" id="@item.ActivityID-Date">
            <option value="07/03/2012">07/03/2012</option>
            <option value="07/04/2012">07/04/2012</option>
            <option value="07/05/2012">07/05/2012</option>
            <option value="07/06/2012">07/06/2012</option>
        </select>   

        @Html.DropDownList(item.ActivityID+"-AdultNum", AdultNum)<br />
        Price/Adult C$:@Html.TextBox(item.ActivityID+"-AdultPrice", item.PricePerAdult)

        @Html.DropDownList(item.ActivityID+"-ChildNum", ChildNum)<br /> 
        Price/Child C$: @Html.TextBox(item.ActivityID+"-ChildPrice", item.PricePerChild)

        <label style="color:Blue"><h3>Total Price C$:</h3></label>
        <input type="text" id="@item.ActivityID-Sum" readonly="readonly"/>

        </div> 
    </li>
}
</ul>
<input type="submit" id="submit" value="Submit" />
}

したがって、基本的に、特定のアイテムのチェックボックス(@ item.ActivityID-Check)をクリックして、フォームを送信すると、次のようになります。

ActivityItemは、リスト内のアクティビティから入力された次のフィールドで作成されます。

  • リストアイテム
  • ActivityID = @ item.ActivityID
  • 名前=@item.Name
  • 日付=@item.ActivityID-日付
  • NumAdults = @ item.ActivityID-AdultNum
  • NumChildren = @ item.ActivityID-ChildNum
  • TotalPrice =@item.ActivityID-合計

ただし、複数のアイテムをクリックすることができ、フォームを送信するときに、ActivityItemのリストを返す必要があります。これは複雑な答えだと思います。その結果、完全な解決策は期待できません(それは素晴らしいことですが)。しかし、私がいくつかのヒントと指針を得ることができれば、それは大きな助けになるでしょう。私は本当にすべてのアドバイスに感謝します。

4

1 に答える 1

2

コレクションをモデルバインドする場合、最初に生成される入力要素の名前はパターンに従う必要があります。

元。

@for (int i = 0; i < 3; i++) 
{
  @Html.TextBoxFor(m => m[i].Title)
  @Html.TextBoxFor(m => m[i].Author)
}

に置き換える必要があることに注意してください。foreachこれforにより、以下のようなhtmlフォームが生成されます。

<form method="post" action="/Home/Create">    
    <input type="text" name="[0].Title" value="Curious George" />
    <input type="text" name="[0].Author" value="H.A. Rey" />

    <input type="text" name="[1].Title" value="Code Complete" />
    <input type="text" name="[1].Author" value="Steve McConnell" />

    ...
</form>

あなたの場合の次のことは、選択したアイテムだけをコレクションにバインドする必要があるということです。したがって、いくつかのことを行う必要があります。1.選択されていないhtml要素を削除します。2。入力要素の名前をリセットし、フォーム送信イベントで行うこれら2つのことを行います。

$("form").submit(function() {

   // iterate the the activities and remove the ones that are not selected 
   // ex.
   $(this).children('[0].Title').remove();
   $(this).children('[0].Author').remove();

   // again iterate the activities in the form and reset their index values
   // ex.
   $(this).children('[1].Title').attr('name', [0].Title);
   $(this).children('[1].Author').attr('name', [0].Author);
});

アップデート:

ActivityItem別の解決策は、特定のアクティビティがユーザーによって選択されたかどうかを示すブールフラグとをラップするビューモデルを作成することです。投稿アクションから、ユーザーが選択したアクティビティをフィルタリングできます。ビューモデルは、この種のシナリオで役立ちます。これにより、フォーム送信イベントを聞くことを回避できます。

public class ActivityItemViewModel
{
   public class ActivityItem { get; set; }
   public bool IsSelected { get; set; }
}

ビューは、IEnumerable<Project.Models.ActivityItemViewModel>の代わりにバインドする必要がありIEnumerable<Project.Models.Activity>ます。アクティビティを選択するために使用されるチェックボックスは、IsSelectedプロパティにバインドする必要があります。

@Html.CheckBoxFor(m => m[i].Isselected)

このコレクションを入力として受け取るコントローラーアクションがあります。

public ActionResult PostAction(IEnumerable<Project.Models.ActivityItemViewModel>)
{
    .. now you can easily filter the Activities that are selected by checking the
    .. IsSelected boolean flag
}
于 2012-07-05T02:58:06.367 に答える