首页 > 解决方案 > 通过 POST 从 View 发送里面有其他 complexObject[] 的 complexObj

问题描述

我必须发送 TestArr 填写Name的输入表单以及 0, 1 或很多ComplexObjsTestArr

不幸的是,我对嵌套表单的实现并没有ComplexObj[]很好地绑定 - 它只是不起作用。知道怎么做吗?我试过了,BeginCollectionItemCore但在那种情况下它并没有真正为我工作

public class TestArr
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set;}
    public ComplexObj[] complex { get; set; }
}

public class ComplexObj
{
    [Key]
    public int Id { get; set; }
    public string a { get; set; }
    public string b { get; set; }
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Name, complex")] TestArr input)
{
    if (ModelState.IsValid)
    {
        _context.Add(input);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    return View();
}

<form asp-action="Create">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>

    <div class="form-group">
        <label asp-for="Name" class="control-label"></label>
        <input asp-for="Name" class="form-control" />
        <span asp-validation-for="Name" class="text-danger"></span>
    </div>

    <div id="ComplexObj">
        <label class="control-label">a</label>
        <input asp-for="complex[0].a" class="form-control" />

        <label class="control-label">b</label>
        <input asp-for="complex[0].b" class="form-control" />       

        <label class="control-label">a</label>
        <input asp-for="complex[1].a" class="form-control" />

        <label class="control-label">b</label>
        <input asp-for="complex[1].b" class="form-control" />
    </div>

    <button type="button" id="addComplex" onclick="test()">addComplex</button>

    <div class="form-group">
        <input type="submit" value="Create" class="btn btn-default" />
    </div>
</form>

编辑

怎么回事?我改为complexin ComplexTestArr[Bind()]开始View工作

但是当我从 javascript as 动态生成输入表单时.innerHTML +=,它会停止......

<script>
    var counter = 0;
    function test()
    {
        var div = document.getElementById('ComplexObj');
        div.appendChild +=
        `
            <label class="control-label">a</label>
            <input asp-for="Complex[${counter}].a" class="form-control" />

            <label class="control-label">b</label>
            <input asp-for="Complex[${counter}].b" class="form-control" />
        `;

        counter++;
    }
</script>

哪个浏览器呈现为:

<label class="control-label">a</label>
<input asp-for="Complex[0].a" class="form-control">

<label class="control-label">b</label>
<input asp-for="Complex[0].b" class="form-control"></div>

所以,整个 div 看起来像:

<div id="ComplexObj" style="height: 200px;">
    <label class="control-label">a</label>
    <input asp-for="Complex[0].a" class="form-control">

    <label class="control-label">b</label>
    <input asp-for="Complex[0].b" class="form-control">
</div>

但 Controller 将其视为null.

标签: c#asp.net-coreasp.net-core-mvc

解决方案


解决方案是:

改变:

<input asp-for="Complex[0].b" class="form-control">

至:

<input name="Complex[0].b" class="form-control">


推荐阅读