MVC更新列表项

时间:2011-08-29 00:10:17

标签: asp.net-mvc

您好我有一个显示InvoicesInvoiceLines的视图。

@model VectorCheck.ViewModels.InvoiceViewModel
@{
    ViewBag.Title = "Invoice Details";
}

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.11.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/EditorHookup.js")" type="text/javascript"></script>

@using (Html.BeginForm())
{
    @Html.ValidationSummary()
    <fieldset>
        <legend>Invoice</legend>
        <table>
            <tr>
                <th>
                    Activity ID
                </th>
                <th>
                    Invoice Line Amount
                </th>
                <th>
                    Payment Type
                </th>
                <th>
                    Note
                </th>
                <th>
                </th>
                <th>
                </th>
                <th>
                </th>
            </tr>
                   @foreach (var item in Model.InvoiceLines) {
                        <tr>
                            <td>
                                @Html.DisplayFor(modelItem => item.Activity.Descriptor)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.Amount)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.PaymentType.Name)
                            </td>
                            <td>
                                <span>Person:</span>
                                @Html.DropDownListFor(modelItem => item.PersonrId, Model.People as IDictionary<string, IEnumerable<SelectListItem>>, "--- Select ---")
                            </td>
                            <td>
                                <input type="submit" value="Update" />
                            </td>
                        </tr>
                   }
            }
        </table>
    </fieldset>
}

我想要的是每个InvoiceLine,而无需转到其他屏幕即可更改Person下拉列表中的值,点击更新并获取此更新InvoiceLine在我可以保存它的控制器中。

然而,当我到达控制器时,InvoiceLine不包含值。

控制器方法:

[HttpPost]
        public ActionResult EditInvoiceLine(InvoiceLine invoiceLine, int id)
        {

            return View(invoiceLine);
        }

有没有人在同一页面上做过这样的事情或者知道怎么做?

不,我不想使用jqgrid。我还有jqgrid不适合的其他功能。

2 个答案:

答案 0 :(得分:0)

我会使用每行格式(使用或不使用AJAX)。请注意,如果您使用非基于表格的布局,这将更容易。您的提交按钮至少需要与要回发的输入共享相同的表元素。此外,您可能只需使用行ID和人员ID,而不是整个模型。使用行ID从数据库中获取实体,然后更新人员ID并保存。删除周围的表单并使用下拉列表在每个表元素中放置一个表单(同时移动提交按钮)。修改您的操作的签名以匹配。

  @foreach (var item in Model.InvoiceLines) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Activity.Descriptor)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Amount)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.PaymentType.Name)
            </td>
            <td>
                @using (Html.BeginForm("EditInvoiceLine", new { id => modelItem.InvoiceId } ))
                {
                   <span>Person:</span>
                   @Html.DropDownListFor(modelItem => item.PersonrId, Model.People as IDictionary<string, IEnumerable<SelectListItem>>, "--- Select ---")

                   <input type="submit" value="Update" />
                }
            </td>
        </tr>
   }

   [HttpPost]
   public ActionResult EditInvoiceLine( int id, int personId )
   {
        var line = db.InvoiceLines.SingleOrDefault( id );
        line.PersonId = personId;
        db.SaveChanges();
        return View( line ); // more more likely a model based on the line...
   }

答案 1 :(得分:0)

InvoiceLine为空,因为控制器不知道它来自何处。此外,'id'来自哪里?不应该是'Personid'吗?在我看来,最简单的技术就是在按钮点击上使用ajax并通过查询字符串使用GET发送值。