我有一个表格,其中包含未知数量的无线电类型输入。所以我必须在模型部分使用数组。

那是我的表格

<form method="post" action="/File/Validate">
    <input type="number" name="fileId" value="@file.ID" class="hidden" />
        @Html.AntiForgeryToken()
        @foreach (var item in file.LABEL)
        {
            string id = item.KLASS.KLASS_NAME + i;
            <div id="@id">
                <input name="klassId[]" value="@item.KLASS.ID" class="hidden"/>
                <p>Class name : @item.KLASS.KLASS_NAME</p>
                <input type="radio" name="result" value="true" />Correct<br />
                <input type="radio" name="result" value="false" />Wrong/Unsure<br />
            </div>
            i++;
                    }
            <button type="submit" class="btn btn-default">Save</button>
</form>


那是模特

public class Validator
{
    public int fileId { get; set; }
    public int[] klassId { get; set; }
    public bool[] result { get; set; }
}


那就是控制器部分

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Validate(Validator validator)
{}


我的问题是,当我单击单选按钮时,答案只有一个进入后端,但是每次KLASS的数量都是未知的。那么,我该怎么建议您提出什么样的解决方案呢?
感谢大伙们。

最佳答案

原因是您要渲染所有具有相同名称的收音机:

<div id="id-1">
    ...
    <input type="radio" name="result" value="true" />Correct<br />
    ...
    <input type="radio" name="result" value="false" />Wrong/Unsure<br />
    ...
</div>
<div id="id-2">
    ...
    <input type="radio" name="result" value="true" />Correct<br />
    ...
    <input type="radio" name="result" value="false" />Wrong/Unsure<br />
    ...
</div>
<div id="id-3">
    ...
    <input type="radio" name="result" value="true" />Correct<br />
    ...
    <input type="radio" name="result" value="false" />Wrong/Unsure<br />
    ...
</div>


看到了吗?在这里,您有3组广播,但是所有广播都具有相同的名称。换句话说,将仅选择其中一个无线电,并且仅将其中一个无线电发送到服务器。

我不得不说的另一件事是,我认为将result[]klassId[]作为单独的数组发布不是一个好主意。如果某人没有检查第二个无线电组,则在服务器端会得到3个klassId和2个result,因此不知道选择哪个两个无线电。

更好的方法是创建一个新的DTO来保存klassId-result组,我们将其命名为ValidatorDetail

public class ValidatorDetail
{
    public int klassId { get; set; }
    public bool result { get; set; }
}


要将它们作为数组发送,可以在视图页面中使用索引呈现字段:

<form method="post" action="/Home/Validate">
    <input type="number" name="fileId" value="@file.ID" class="hidden" />
    @Html.AntiForgeryToken()
    @{ var i = 0;}
    @foreach (var item in file.LABEL)
    {
        string id = item.KLASS.KLASS_NAME + i;
        <div id="@id">
            <input name="details[@i].klassId" value="@item.KLASS.ID" class="hidden"/>
            <p>Class name : @item.KLASS.KLASS_NAME</p>
            <input type="radio" name="details[@i].result" value="true" />Correct<br />
            <input type="radio" name="details[@i].result" value="false" />Wrong/Unsure<br />
        </div>
        i++;
    }
    <button type="submit" class="btn btn-default">Save</button>
</form>


最后,如下更改控制器操作:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Validate(int fileId,[FromForm]ValidatorDetail[] details)
{
    return new JsonResult(details);
}


它将按预期工作。

10-08 01:19