.Net Core 单选按钮总是返回 false

Posted

技术标签:

【中文标题】.Net Core 单选按钮总是返回 false【英文标题】:.Net Core Radio Button always returns false 【发布时间】:2020-01-12 08:32:22 【问题描述】:

我正在向视图发送一个列表。 尝试通过表单提交列表中的每个项目。

型号:

 public partial class Model
    
        public int Id  get; set; 
        public string UId  get; set; 
        public int WId  get; set; 
        public bool IsEnabled  get; set; 

        public virtual AspNetUsers User  get; set; 
        public virtual WModel W  get; set; 
    

控制器:

public IActionResult UWC()

    List<Model> uW = db.UW.Include(x => x.U).Include(x=>x.W).ToList();
    return View(uW);


[HttpPost]
public IActionResult UWC(Model uW)

    var s = ModelState.ErrorCount;
    return RedirectToAction("UWC");

查看

@model List<Model>
            <table  class="table">
                <thead>
                    <tr>
                        <th>
                            @html.DisplayNameFor(model => model[0].W.Name)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model[0].W.Type)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model[0].W.Description)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model[0].W.IsActive)
                        </th>
                    </tr>
                </thead>
                <tbody>
                    @for (var item = 0; item < Model.Count(); item++)
                    
                        <tr>
                            <td>
                                @Html.DisplayFor(model => model[item].W.Name)
                            </td>
                            <td>
                                @Html.DisplayFor(model => model[item].W.Type)
                            </td>
                            <td>
                                @Html.DisplayFor(model => model[item].W.Description)
                            </td>
                            <td>
                            <form asp-action="UserWidgetConfiguration" asp-controller="UserManagement" method="post">
                                @Html.RadioButtonFor(model => model[item].IsEnabled, true, new  @Name = "IsEnabled",, id = "enabled_" + item  )<label>True</label>
                                @Html.RadioButtonFor(model => model[item].IsEnabled, false, new  @Name = "IsEnabled" ,, id = "disabled_" + item )<label>False</label>
                                <input type="hidden" asp-for="@Model[item].Id" value="@Model[item].Id" name="Id" />
                                <input type="hidden" asp-for="@Model[item].WidgetId" value="@Model[item].WidgetId" name="WidgetId" />
                                <input type="hidden" asp-for="@Model[item].UserId" value="@Model[item].UserId" name="UserId" />
                            </form>
                            </td>
                        </tr>
                    
                </tbody>
            </table>
        </div>
    </div>
</div>
@section Scripts
    <script>
        $(function () 
            $('input[type=radio]').change(function () 
                $(this).closest('form').submit();
            );
        );
    </script>

以上是完整的代码。

单选按钮始终绑定为 false。

但是, 我正在使用脚本提交单选按钮值更改表单:

  <script>
        $(function () 
            $('input[type=radio]').change(function () 
                var data = JSON.stringify($(this).closest('form').serializeArray());
                console.log(data);
                $(this).closest('form').submit();
            );
        );
    </script>

控制台会为单选按钮提供正确的值。

["name":"[0].IsEnabled","value":"True","name":"Id","value":"1","name":"WId","value":"1","name":"UId","value":"a","name":"__RequestVerificationToken","value":"CfDJ8FLfqW1-k2hNlQsGtRBQVqOKRWmlkQYWTMrEQNcJHWGd7_LPvHfjw3V5gxYAnLjwz7HvjExZDXgmbSMQ1DnEONg7EJfu5OqYm7xntqXIe4IMkD1HD4SHRtihdyzDXHrKu7jNXUwuN1B6H-565O0J0oZsGVCopZqy180oPco29vqyvpcZkZnWEOmVQX6_V3T6AQ"]

当我期望控制器中 IsEnabled 的值为真时,我得到的是假值。

但是当表单被序列化并显示在控制台中时,该值如预期的那样为真。

这是因为事件处理程序吗?

【问题讨论】:

【参考方案1】:

无线电输入名称中的数组前缀 ([0].IsEnabled) 导致输入未映射到模型中,因为名称应为 IsEnabled。 作为简单的解决方法,您可以在没有 HTML Helpers 的情况下手动创建输入,例如:

<input type="radio" name="IsEnabled" value="True"/> <label>True</label>
<input type="radio" name="IsEnabled" value="False"/> <label>False</label>

有关更多详细信息,请参阅帮助程序的 source。

【讨论】:

以上是关于.Net Core 单选按钮总是返回 false的主要内容,如果未能解决你的问题,请参考以下文章

如何确定在 C# ASP.NET CORE MVC 5.0 中选择了哪个单选按钮

为啥单选按钮列表总是占据一个新行?

isSelected() 不适用于硒中的单选按钮

单选按钮上的模型绑定为该属性返回 null (ASP.NET Core)

如何隐藏单选按钮列表中的单选按钮之一?

asp.net中如何判断单选按钮列表是不是被选中