0

データベースでフラグ (アクティブ) を更新しようとしています。これを行うには、次のようなビューがあります。ビューでは、データベースにレコードがあり、ビューのテーブルの各行に BillPayID を渡しています。ユーザーがSTARTまたはSTOPボタンを押すと、アクティブフラグが0または1に設定されます。

問題は、別の行のボタンがクリックされた場合でも、私のビューは常に最初の BillPayID を送信していることです。

誰か助けてくれませんか?

@if (Model !=null)
        {
            using (Html.BeginForm("StopScheduled", "Admin", FormMethod.Post, new { }))
            { 
               <table>
                <tr>
                    <th>
                        Account Number 
                    </th>
                    <th>
                        Payee ID
                    </th>
                    <th>
                        Amount
                    </th>                 
                    <th>
                        Scheduled Date
                    </th>
                     <th>
                        Period
                    </th>
                    <th>
                        Active
                    </th>
                    <th>
                        Stop/Start Payment
                    </th>           

                </tr>

                @foreach(var item in Model)
                {

                    @Html.HiddenFor(model => item.BillPayID)

                    <tr>
                        <td>
                            @Html.DisplayFor(model => item.AccountNumber)
                            @Html.HiddenFor(model => item.AccountNumber)
                        </td>

                        <td>
                            @Html.DisplayFor(model => item.PayeeID)
                            @Html.HiddenFor(model => item.PayeeID)
                        </td>
                        <td>
                           $ @Html.DisplayFor(model => item.Amount)
                            @Html.HiddenFor(model => item.Amount)
                        </td>
                        <td>
                            @Html.DisplayFor(model => item.ScheduleDate)
                            @Html.HiddenFor(model => item.ScheduleDate)
                        </td>
                         <td>
                            @Html.DisplayFor(model => item.Period)
                             @Html.HiddenFor(model => item.Period)
                        </td>
                        <td>
                            @Html.DisplayFor(model => item.Active)
                             @Html.HiddenFor(model => item.Active)
                        </td> 

                        <td>
                            @if (item.Active == 0)
                            {
                                <input type="submit" style="width:100%" value="START" />

                            }
                            else                         
                            {
                                <input type="submit" style="width:100%" value="STOP" />
                            }

                        </td>  

                    </tr>

                }

                </table>
            }

        }

これがコントローラーです

 [HttpPost]
         public ActionResult StopScheduled([Bind(Prefix = "item")]  BillPayModel model)
         {
             int NewActive = 1;

             if (model.Active == 1)
             {
                 NewActive = 0;
             }

             try
             {
                 if (ModelState.IsValid)
                 {

                     BillPay EditBillPay = db.BillPays.Find(model.BillPayID);
                     EditBillPay.Active = NewActive;
                     EditBillPay.ModifyDate = DateTime.Now;
                     db.Entry(EditBillPay).State = EntityState.Modified;
                     db.SaveChanges();
                     return View(model);
                 }
                 else
                 {
                     ModelState.AddModelError("", "Could not Stop Scheduled Payment");
                 }
             }


             catch (FormatException)
             {
                 ModelState.AddModelError("", "Could not Stop Scheduled Payment");
             }


             return View(model);
         }
4

1 に答える 1

0

非表示のフィールドにはまだhtmlの名前とIDがあるため、あなたの場合、BillPayIDのx個の非表示フィールドを配置すると、すべてitem.BillPayIDという名前になります。

foreach ループを次のように for ループに変更します。

@for (int i =0; i < Model.Count(); i++)
{
  @Html.HiddenFor(model => Model[i].BillPayID)

  .... rest of your code
}

ビュー コードはモデル全体 (IEnumerable) をコントローラーに送信します。これにより、選択した項目を追跡するモデルの値を設定しているように見えないため、どの行が選択されたかを判断するのが難しくなります。

開始/停止プロセスを別のビューに移動することをお勧めします。テーブル内の項目をクリックすると、開始または停止を求める 2 番目のページが表示されます。JavaScript 関数を使用して、選択した値をコントローラーに送信することもできます。

于 2013-10-21T23:22:04.697 に答える