c# - 具有相同名称的多个单选按钮需要架构

标签 c# asp.net-core-2.0 model-binding forms http-post

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

这是我的表格

<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; }
}

那是 Controller 部分

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

我的问题是,当我单击单选按钮时,只有一个答案进入后端,但每次都不知道 KLASS 的数量。那么我应该怎么做你建议什么样的解决方案? 感谢你们。

最佳答案

原因是您正在渲染所有具有相同名称的 radio :

<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 组 radio ,但所有 radio 都共享相同的名称。换句话说,只会选择其中一个 radio ,并且只会将其中一个发送到服务器

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

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

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

要将它们作为数组发送,您可以在 View 页面中呈现带有索引的字段:

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

最后,如下更改您的 Controller 操作:

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

它将按预期工作。

关于c# - 具有相同名称的多个单选按钮需要架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52887678/

相关文章:

C# 全局键和 SetForegroundWindow

c# - X 的所有可能组合分成 N 个堆栈

angular - 将 IndentityServer4 与 Angular、AspNet Core 一起使用时,未找到签名 key 错误

.net - 在 Visual Studio 2015 中安装 Net Core 2.0 构建后出现问题

asp.net-mvc - 模型绑定(bind)后模型嵌套类型为空

c# - 使用 compiletoMethod() 表达式树静态链接和编译运行时

c# - 如何在 JavaScript 中获取路由参数?

asp.net - AspNet.Security.OpenIdConnect 与 OAuthAuthorizationProvider

asp.net-mvc - Get 和 Post 的不同模型 - MVC

c# - 为什么 ASP.Net MVC 模型绑定(bind)器将空 JSON 数组绑定(bind)到 null?