Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC表单中视图中的空对象_Asp.net Mvc - Fatal编程技术网

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">