ASP.NET MVC表单中的视图中的空对象

时间:2018-08-14 12:45:53

标签: asp.net-mvc

我正在构建一个简单的库存应用程序,用户可以通过选择要交付的物品来创建订单,并在表单中填写收货人的姓名,然后对订单进行处理。

首先,我有一个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,而当控制器呈现视图时,则不是。

谢谢, 戴维德。

1 个答案:

答案 0 :(得分:0)

您必须使用@ Html.HiddenFor(model => model.OrdineScarico) 也可能是DeliverDetails具有必须为其设置值的其他字段。

您可以在线使用断点:  如果(ModelState.IsValid) 在Conferma的方法中。 运行代码,当代码到达断点时, 将光标移至ModelState并等待查看其中的数据。 在值上检查所有实体,并找出哪个属性有错误,您可以看到错误消息。

编辑:因为您尚未发送OrdineScarico的任何数据。因此在后期操作中它将为null。 OrdineScarico有一个列表成员,因此 您应该添加它。

<input hidden name="OrdineScarico.ordineCollection[]" value="@value">