MVC5 POST表单从先前索引

时间:2016-06-02 06:13:39

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

我使用从Controller传入的模型填充了我的View。每个循环还将生成一个超链接按钮,在guid中传递。但是,当我单击按钮并启动 POST 请求时,guid属于上一个索引的按钮。

然而,在使用Chrome的检查工具检查元素后,按钮上附有正确的guid。只需在单击按钮(POSTing)时,作为参数传递的guid属于上一个索引。

例如:

按钮A(GUID 1000)

按钮B(GUID 2000)

按钮C(GUID 3000)

当我点击按钮B时,为POSTing传递的guid为1000,属于Button A.

Index.cshtml

@foreach (var item in Model) {
           <tr>
              <td>
                 @Html.DisplayFor(modelItem => item.PatientName)
              </td>
              <td>
                 @Html.DisplayFor(modelItem => item.NRIC)
              </td>
              <td>
              @using (Html.BeginForm("Patient", "MainController", new { guid = item.PatientId }, FormMethod.Post, new { id = "submitRequest" })) {
               @Html.AntiForgeryToken()
                <a href="javascript:document.getElementById('submitRequest').submit()" onclick="return confirm('A pop up message.');" class="btn btn-success glyphicon glyphicon-plus" title="Request"></a>
                    }
               </td>
             </tr>
          }

MainController.cs

// POST: Doctor/Patient
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Patient(string guid) {
            try {
                if (ModelState.IsValid) {
                    var currentTime = DateTime.Now;
                    db.Appeal.Add(new Appeal {
                        DoctorId = User.Identity.GetUserId(),
                        PatientId = guid, // issue is here.
                        Time = currentTime, 
                        IsApprove = false
                    });
                    TempData["Message"] = "Appeal is being processed. Check the Request page for outcome.";
                    db.SaveChanges();
                    return RedirectToAction("Patient");
                }
            } catch (DataException dex) {
            }
            return RedirectToAction("Patient");
        }

我可以知道哪里出错了吗?一直试图修复这个过去1个小时,似乎无法弄清楚是什么导致它。

2 个答案:

答案 0 :(得分:1)

这一行

@using (Html.BeginForm("Patient", "Doctor", new { guid = item.PatientId }, FormMethod.Post, new { id = "submitRequest" })) 

id对于所有表单元素都相同,并且您使用相同的id元素通过javascript提交这些表单。所以当你打电话时

document.getElementById('submitRequest`)

它将始终返回具有给定id的第一个表单元素。您需要为每个表单元素附加不同的id属性。

答案 1 :(得分:0)

<强>解决方案

更新 Index.cshtml ,如下所示。

@using (Html.BeginForm("Patient", "Doctor", new { guid = item.PatientId }, FormMethod.Post)) {
                                            @Html.AntiForgeryToken()
                                            <button class="btn btn-success glyphicon glyphicon-plus" type="submit" onclick="return confirm('Are you sure?')"></button>
                                    }