您好我有一个显示Invoices
和InvoiceLines
的视图。
@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不适合的其他功能。
答案 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发送值。