我正在构建一个简单的库存应用程序,用户可以通过选择要交付的物品来创建订单,并在表单中填写收货人的姓名,然后对订单进行处理。
首先,我有一个OrdineScarico
类,用于存储要处理的InventoryItems的集合(例如购物车),一个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; }
}
然后是ConfermaScaricoViewModel
类(在不同的命名空间中)将它们包装起来
public class ConfermaScaricoViewModel
{
public OrdineScarico OrdineScarico { get; set; }
public DeliverDetails DeliverDetails { 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
参数得到一个空值,而ModelState始终为false。我也尝试添加一个隐藏字段
@Html.HiddenFor(model => model.OrdineScarico)
但是,当调用POST方法时,OrdineScarico
参数始终为null,而当控制器呈现视图时,则不是。
谢谢, 戴维德。
答案 0 :(得分:0)
您必须使用@ Html.HiddenFor(model => model.OrdineScarico) 也可能是DeliverDetails具有必须为其设置值的其他字段。
您可以在线使用断点: 如果(ModelState.IsValid) 在Conferma的方法中。 运行代码,当代码到达断点时, 将光标移至ModelState并等待查看其中的数据。 在值上检查所有实体,并找出哪个属性有错误,您可以看到错误消息。
编辑:因为您尚未发送OrdineScarico的任何数据。因此在后期操作中它将为null。 OrdineScarico有一个列表成员,因此 您应该添加它。
<input hidden name="OrdineScarico.ordineCollection[]" value="@value">