繁体   English   中英

IList在HttpPost上始终为null

[英]IList always null on HttpPost

我使用这种模式将模型绑定到列表,但是当我发布表单时,IList始终为null。

我以前已经成功使用过这种模式。 这次与我过去所做的有些不同,因为这些字段是在子循环中生成的。 不知道这就是为什么它不起作用的原因。 我已经做了很多试验和错误,所以我希望有人可以看到我在做错什么:

索引检视

@model Collect.ViewModels.JobWorker
@{
    ViewBag.Title = $"{Model.Job.Name} - Workers";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>@ViewBag.Title</h2>

@using (Html.BeginForm("Update", "Workers"))
{
    @Html.AntiForgeryToken()
    @Html.HiddenFor(model => Model.JobId)
    int z = 0;
    for (int x = 0; x < Model.WorkPeriods.Count; x++)
    {
        <h3>@Model.WorkPeriods[x].StartDate.toIsoDateString() through @Model.WorkPeriods[x].EndDate.toIsoDateString()</h3>
        <div style="display: flex; flex-wrap: wrap;">
            @for (int y = 1; y <= Model.Job.MaximumNumber; y++)
            {
                <div class="panel panel-primary panel-info-1" >
                    <div class="panel-heading">
                        <span class="fa fa-clock-o"></span> Opening @Model.Workers[z].OpeningNumber
                    </div>
                    <div class="panel-body">
                        @Html.DropDownListFor(model => Model.Workers[z].PersonId, 
                       new SelectList(Model.People, "PersonId", "Name"), 
                       htmlAttributes: new { @class = "form-control" })
                    </div>
                </div>
                @Html.HiddenFor(model => Model.Workers[z].Id);
                @Html.HiddenFor(model => Model.Workers[z].JobId);
                @Html.HiddenFor(model => Model.Workers[z].WorkerId);
                @Html.HiddenFor(model => Model.Workers[z].OpeningNumber);
                @Html.HiddenFor(model => Model.Workers[z].StartDate);
                @Html.HiddenFor(model => Model.Workers[z].EndDate);
                z++;
            }
            <div class="panel-info-1" >
                <button type="submit" value="Update" class="btn btn-default">Update</button>
            </div>
        </div>
    }

}

<div>
    @Html.ActionLink("Back to Jobs", "Index", "Jobs")
</div>

JobWorker模型

public class JobWorker
{
    public byte JobId { get; set; }

    public Job Job { get; set; }

    public List<Person2> People { get; set; }

    public List<WorkPeriod> WorkPeriods { get; set; }

    public IList<Dto.Worker> Workers { get; set; }
}

工人模型

public class Worker
{
    public Worker(byte id)
    {
        Id = id;
    }

    [Key]
    public byte Id { get; set; }

    public int? WorkerId { get; set; }

    public int? PersonId { get; set; }

    public byte JobId { get; set; }

    public string StartDate { get; set; }

    public string EndDate { get; set; }

    public byte OpeningNumber { get; set; }

}

索引控制器动作

public ActionResult Index(int? Id)
{
    var jobEnt = db.Jobs.Where(x => x.JobId == Id).FirstOrDefault();

    var jobWorker = new JobWorker()
    {
        JobId = jobEnt.JobId,
        Job = Mapper.Map<Ent.Job, Mod.Job>(jobEnt),
        WorkPeriods = new List<WorkPeriod> { startPeriod },
        Workers = new List<Dto.Worker>(),
        People = db.People.ToList()
    };

    // business logic to populate WorkPeriods and Workers here.

    return View(jobWorker);
}

渲染表格

<form action="/Workers/Update" method="post">
    <input data-val="true" data-val-number="The field JobId must be a number." data-val-required="The JobId field is required."
        id="JobId" name="JobId" type="hidden" value="7" />

    <h3>2018-05-01 through 2018-05-31</h3>
    <div style="display: flex; flex-wrap: wrap;">
        <div class="panel panel-primary">
            <div class="panel-heading">
                <span class="fa fa-clock-o"></span> Opening 1
            </div>
            <div class="panel-body">
                <select class="form-control" data-val="true" data-val-number="The field PersonId must be a number." id="Workers_0__PersonId"
                    name="Workers[0].PersonId">
                    <option value=""></option>
                    <option value="1">Person 1</option>
                    <option value="2">Person 2</option>
                </select>
            </div>
        </div>

        <input data-val="true" data-val-number="The field JobId must be a number." data-val-required="The JobId field is required."
            id="Workers_0__JobId" name="Workers[0].JobId" type="hidden" value="7" />
        <input data-val="true" data-val-number="The field WorkerId must be a number." id="Workers_0__WorkerId" name="Workers[0].WorkerId"
            type="hidden" value="" />
        <input data-val="true" data-val-number="The field OpeningNumber must be a number." data-val-required="The OpeningNumber field is required."
            id="Workers_0__OpeningNumber" name="Workers[0].OpeningNumber" type="hidden" value="1" />
        <input id="Workers_0__StartDate" name="Workers[0].StartDate" type="hidden" value="2018-05-01" />
        <input id="Workers_0__EndDate" name="Workers[0].EndDate" type="hidden" value="2018-05-31" />

        <div class="panel panel-primary" style="width: 400px; margin: 20px;">
            <div class="panel-heading">
                <span class="fa fa-clock-o"></span> Opening 2
            </div>
            <div class="panel-body">
                <select class="form-control" data-val="true" data-val-number="The field PersonId must be a number." id="Workers_1__PersonId"
                    name="Workers[1].PersonId">
                    <option value=""></option>
                    <option value="1">Person 1</option>
                    <option value="2">Person 2</option>
                </select>
            </div>
        </div>
        <input data-val="true" data-val-number="The field JobId must be a number." data-val-required="The JobId field is required."
            id="Workers_1__JobId" name="Workers[1].JobId" type="hidden" value="7" />
        <input data-val="true" data-val-number="The field WorkerId must be a number." id="Workers_1__WorkerId" name="Workers[1].WorkerId"
            type="hidden" value="" />
        <input data-val="true" data-val-number="The field OpeningNumber must be a number." data-val-required="The OpeningNumber field is required."
            id="Workers_1__OpeningNumber" name="Workers[1].OpeningNumber" type="hidden" value="2" />
        <input id="Workers_1__StartDate" name="Workers[1].StartDate" type="hidden" value="2018-05-01" />
        <input id="Workers_1__EndDate" name="Workers[1].EndDate" type="hidden" value="2018-05-31" />

        <div style="width: 400px; margin: 20px;">
            <button type="submit" value="Update" class="btn btn-default">Update</button>
        </div>
    </div>

</form>

更新控制器动作

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Update(byte JobId, IList<Dto.Worker> newWorkers)
{
    // newWorkers is always null

    // logic to update is here

    return RedirectToAction("Index", "Jobs");
}

根据视图中使用的模型,

@model Collect.ViewModels.JobWorker

Update操作预期模型错误,这就是为什么模型联编程序未转换模型的原因。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Update(byte JobId, JobWorker model) {
    If(ModelState.IsValid) {
        IList<Dto.Worker> newWorkers = model.Workers;

        // logic to update is here

        return RedirectToAction("Index", "Jobs");
    }
    return View(model);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM