项目列表始终为 null MVC 5
List of Items always null MVC 5
我被这个问题困住了,无法解决。
这是我的ViewModel
public class AddOrderReceive
{
public string item_name { get; set; }
public DateTime? date_received { get; set; }
public decimal? quantity_received { get; set; }
public bool IsSelected { get; set; }
public decimal? item_rate { get; set; }
}
这是我的View
@model List<newtest.Models.AddOrderReceive>
@if(Model != null && Model.Count > 0)
{
for(var i = 0; i < Model.Count; i++)
{
<tr>
@if(Model[i].quantity_remaining == 0)
{
<td colspan="6" class="text-center">Already Sent</td>
}
else
{
@Html.HiddenFor(r => Model[i].item_id)
<td>@Html.CheckBoxFor(r => Model[i].IsSelected)</td>
<td>@Html.EditorFor(r => Model[i].item_rate)</td>
}
</tr>
}
}
最后,这是我的 Controller
:
[HttpGet]
public ActionResult AddRAR(int? my_id)
{
try
{
var get_items = (from or in db.orders
where or.id == my_id
select new AddOrderReceive()
{
item_name = or.item_name,
quantity_received = or.quantity_receive,
date_received = or.date_receive,
order_receive_id = or.order_receive_id
}).ToList();
foreach(var t in get_items)
{
var get_remain = (from ra in db.order_detail
where ra.contract_id == t.ca_id && ra.order_receive_id == t.order_receive_id
select new
{
consump_quantity = ra.consump_quantity
});
t.quantity_remaining = t.quantity_received - get_remain.Sum(r => r.consump_quantity) ?? t.quantity_received;
}
return View(get_items);
}
catch(Exception ex)
{
}
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddReceivng(List<AddOrderReceive> rc_form)
{
//Some Logic
}
问题是每当我 post 表格时,它总是 null
。但是当我删除这个块时:
@if(Model[i].quantity_remaining == 0)
{
<td colspan="6" class="text-center">Already Sent</td>
}
它开始工作了。我不知道出了什么问题。我到处都找遍了,还是没找到问题所在。
你的 @if(Model[i].quantity_remaining == 0)
代码块,如果它在第一次迭代中执行,意味着你的集合索引器不会是基于零的。 DefaultModelBinder
要求集合索引器从零开始并且是连续的。
您可以通过包含索引器的隐藏输入来覆盖此行为。另请注意,<input>
不是 <tr>
的有效子元素,应位于 <td>
元素内。
for(var i = 0; i < Model.Count; i++)
{
@if(Model[i].quantity_remaining == 0)
{
<td colspan="6" class="text-center">Already Sent</td>
}
else
{
<td>
<input type="hidden" name="Index" value="@i" /> // Add this
@Html.HiddenFor(r => r[i].item_id)
@Html.CheckBoxFor(r => r[i].IsSelected)
</td>
<td>@Html.EditorFor(r => r[i].item_rate)</td>
}
}
我被这个问题困住了,无法解决。
这是我的ViewModel
public class AddOrderReceive
{
public string item_name { get; set; }
public DateTime? date_received { get; set; }
public decimal? quantity_received { get; set; }
public bool IsSelected { get; set; }
public decimal? item_rate { get; set; }
}
这是我的View
@model List<newtest.Models.AddOrderReceive>
@if(Model != null && Model.Count > 0)
{
for(var i = 0; i < Model.Count; i++)
{
<tr>
@if(Model[i].quantity_remaining == 0)
{
<td colspan="6" class="text-center">Already Sent</td>
}
else
{
@Html.HiddenFor(r => Model[i].item_id)
<td>@Html.CheckBoxFor(r => Model[i].IsSelected)</td>
<td>@Html.EditorFor(r => Model[i].item_rate)</td>
}
</tr>
}
}
最后,这是我的 Controller
:
[HttpGet]
public ActionResult AddRAR(int? my_id)
{
try
{
var get_items = (from or in db.orders
where or.id == my_id
select new AddOrderReceive()
{
item_name = or.item_name,
quantity_received = or.quantity_receive,
date_received = or.date_receive,
order_receive_id = or.order_receive_id
}).ToList();
foreach(var t in get_items)
{
var get_remain = (from ra in db.order_detail
where ra.contract_id == t.ca_id && ra.order_receive_id == t.order_receive_id
select new
{
consump_quantity = ra.consump_quantity
});
t.quantity_remaining = t.quantity_received - get_remain.Sum(r => r.consump_quantity) ?? t.quantity_received;
}
return View(get_items);
}
catch(Exception ex)
{
}
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddReceivng(List<AddOrderReceive> rc_form)
{
//Some Logic
}
问题是每当我 post 表格时,它总是 null
。但是当我删除这个块时:
@if(Model[i].quantity_remaining == 0)
{
<td colspan="6" class="text-center">Already Sent</td>
}
它开始工作了。我不知道出了什么问题。我到处都找遍了,还是没找到问题所在。
你的 @if(Model[i].quantity_remaining == 0)
代码块,如果它在第一次迭代中执行,意味着你的集合索引器不会是基于零的。 DefaultModelBinder
要求集合索引器从零开始并且是连续的。
您可以通过包含索引器的隐藏输入来覆盖此行为。另请注意,<input>
不是 <tr>
的有效子元素,应位于 <td>
元素内。
for(var i = 0; i < Model.Count; i++)
{
@if(Model[i].quantity_remaining == 0)
{
<td colspan="6" class="text-center">Already Sent</td>
}
else
{
<td>
<input type="hidden" name="Index" value="@i" /> // Add this
@Html.HiddenFor(r => r[i].item_id)
@Html.CheckBoxFor(r => r[i].IsSelected)
</td>
<td>@Html.EditorFor(r => r[i].item_rate)</td>
}
}