Asp.net mvc ASP.NET MVC表单中视图中的空对象
我正在构建一个简单的库存应用程序,其中用户通过选择他想要交付的物品来创建订单,用收件人的姓名填写表单,然后处理订单 首先,我有一个Asp.net mvc ASP.NET MVC表单中视图中的空对象,asp.net-mvc,Asp.net Mvc,我正在构建一个简单的库存应用程序,其中用户通过选择他想要交付的物品来创建订单,用收件人的姓名填写表单,然后处理订单 首先,我有一个OrdineScarico类,用于存储要处理的库存项目集合(如购物车),一个DeliverDetails类,用于存储收件人名称 public class OrdineScarico { private List<SingoloOrdine> ordineCollection = new List<SingoloOrdine>();
OrdineScarico
类,用于存储要处理的库存项目集合(如购物车),一个DeliverDetails
类,用于存储收件人名称
public class OrdineScarico
{
private List<SingoloOrdine> ordineCollection = new List<SingoloOrdine>();
// collection methods
}
public class SingoloOrdine
{
public InventoryItem InventoryItem { get; set; }
public int Qty { get; set; }
}
public class DeliverDetails
{
[Required(ErrorMessage = "Inserire il nome del ricevente")]
public string Nome { get; set; }
}
我在ScaricoController
public ViewResult Conferma()
{
return View(
new ConfermaScaricoViewModel
{
OrdineScarico = GetScarico(),
DeliverDetails = new DeliverDetails()
});
}
[HttpPost]
public ViewResult Conferma(ConfermaScaricoViewModel viewModel)
{
if (ModelState.IsValid)
{
repositoryProcessor.ScaricaItem(viewModel.OrdineScarico, viewModel.DeliverDetails);
viewModel.OrdineScarico.Clear();
return View("Confermato");
}
else
{
return View(
new ConfermaScaricoViewModel
{
OrdineScarico = GetScarico(),
DeliverDetails = new DeliverDetails()
});
}
}
其中GetScarico()
从活动会话读取OrdineScarico
实例
private OrdineScarico GetScarico()
{
OrdineScarico scarico = (OrdineScarico)Session["Scarico"];
if (scarico == null)
{
scarico = new OrdineScarico();
Session["Scarico"] = scarico;
}
return scarico;
}
这是视图代码:
@model GestioneMagazzino.WebUI.Models.ConfermaScaricoViewModel
@{
ViewBag.Title = "Conferma";
}
<h2>Conferma scarico</h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary()
<div class="form-group col-md-12">
<div class="row">
<label class="text-left">Ricevente:</label>
</div>
<div class="row">
@Html.TextBoxFor(model => model.DeliverDetails.Nome, new { @class="col-md-7" })
</div>
</div>
<div>
<input class="btn btn-primary" type="submit" value="Conferma" />
</div>
}
但是调用POST方法时,OrdineScarico
参数始终为null,而控制器渲染视图时则不是
谢谢,
Davide.必须使用@Html.HiddenFor(model=>model.ordinesco) 也可能是DeliverDetails有其他字段,您必须为其设置值 您可以在线上使用断点: if(ModelState.IsValid) 在会议方法中。 运行代码,当代码到达断点时, 将光标移动到ModelState并等待查看其中的数据。 在值上,检查所有实体,找出哪个属性有错误,您可以看到错误消息 编辑:因为您尚未发送OrdineScarico的任何数据。因此,在post操作中它将为空。 OrdineScarico有一个名单成员 你应该加上这个
<input hidden name="OrdineScarico.ordineCollection[]" value="@value">
不能将复杂对象的集合绑定到输入。在任何情况下,OrdinCollection
是一个字段而不是属性,因此即使您为集合中每个项的每个属性创建了输入,也不会绑定。但这太疯狂了,只需在POST方法中再次获取集合谢谢。我刚从帖子中删除了OrdineScarico我使用了你建议的助手,这是在帖子中写的。调试清楚地显示DeliverDetails是ok的,OrdineScarico是空的。最后,考虑到OrdineScarico处于会话级别,我将其从等式中删除
@Html.HiddenFor(model => model.OrdineScarico)
<input hidden name="OrdineScarico.ordineCollection[]" value="@value">