我有一个看起来像这样的Razor视图:
@model Namespace.Namespace.SupplierInvoiceMatchingVm
@using(Html.BeginForm("MatchLines", "PaymentTransaction"))
{
<table class="dataTable" style="width: 95%; margin: 0px auto;">
<tr>
<th></th>
<th>PO Line</th>
<th>Description</th>
</tr>
@for (var i = 0; i < Model.Lines.Count; i++)
{
<tr>
<td>@Html.CheckBoxFor(x => x.Lines[i].Selected)</td>
<td>@Html.DisplayFor(x =>x.Lines[i].LineRef) @Html.HiddenFor(x => x.Lines[i].LineRef)</td>
<td>@Html.DisplayFor(x =>x.Lines[i].Description) @Html.HiddenFor(x => x.Lines[i].Description)</td>
</tr>
}
</table>
<input type="submit" value="Submit"/>
}
其中Lines
是SupplierInvoiceMatchingDto
个对象的列表,MatchLines
方法签名看起来像
public ActionResult MatchLines(IEnumerable<SupplierInvoiceMatchingDto> list)
当我点击此视图上的提交按钮时,列表将作为null
传递给控制器。
但是,如果我将Model
更改为List<SupplierInvoiceMatchingDto>
,而将所有表格行更改为x => x[i].Whatever
,则会将所有信息发布为正确。
我的问题是:我如何将列表发布到控制器,同时将模型保持为SupplierInvoiceMatchingVm
,因为我需要在此视图中从模型中获取其他一些东西(我为了简洁而将其取出)缘故)。
注意:我已经取出了一些用户输入字段,它不仅仅是发布给出的相同数据。
答案 0 :(得分:2)
您可以使用[Bind]
属性并指定前缀:
[HttpPost]
public ActionResult MatchLines([Bind(Prefix="Lines")] IEnumerable<SupplierInvoiceMatchingDto> list)
{
...
}
甚至更好地使用视图模型:
public class MatchLinesViewModel
{
public List<SupplierInvoiceMatchingDto> Lines { get; set; }
}
然后让你的POST控制器操作采用这个视图模型:
[HttpPost]
public ActionResult MatchLines(MatchLinesViewModel model)
{
... model.Lines will obviously contain the required information
}
答案 1 :(得分:1)
您的发布操作未正确接受模型(应该是您的ViewModel)?不应该是:
[HttpPost]
public ActionResult MatchLines(SupplierInvoiceMatchingVm viewModel)
{
var list = viewModel.Lines;
// ...
}