【问题标题】:Hidden form values not binding on Form POST隐藏的表单值未绑定到表单 POST
【发布时间】:2020-01-11 11:20:05
【问题描述】:

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

型号:

 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>
                                @if (Model[item].IsEnabled)
                                {
                                    @try
                                    {
                                        <form asp-action="UWC" asp-controller="UM" method="post">
                                            <div class="switch switch--horizontal switch--no-label ">
                                                <input asp-for="@Model[item].IsEnabled" type="radio" value="@Model[item].IsEnabled" class="form-control" />
                                                <input asp-for="@Model[item].IsEnabled" type="radio" value="false" class="form-control" />
                                                <span class="toggle-outside"><span class="toggle-inside"></span></span>
                                            </div>

                                            <input type="hidden" asp-for="@Model[item].Id" value="@Model[item].Id" />
                                            <input type="hidden" asp-for="@Model[item].WId" value="@Model[item].WId" />
                                            <input type="hidden" asp-for="@Model[item].UId" value="@Model[item].UId" />

                                        </form>
                                    }
                                    catch (Exception e)
                                    {
                                        var s = e.Message;
                                    }
                                }
                            </td>
                        </tr>
                    }
                </tbody>
            </table>
        </div>
    </div>
</div>
@section Scripts{
    <script>
        $(function () {
            $('input[type=radio]').change(function () {
                $(this).closest('form').submit();
            });
        });
    </script>
}

以上是完整的代码。

当我使用单选按钮切换提交表单时,只有 IsEnabled 属性被绑定到 POST。

但页面源显示所有属性都在视图中正确绑定,即 Id、Uid、Wid 所有这些属性都已替换为它们的值。

@Model[item].Id 不一定按顺序排列,但我相信 item - 循环变量决定模型绑定。

当页面源具有模型值时,为什么它没有反映在 POST 上?
如果模型绑定中断,如何正确绑定 IsEnabled 属性?

【问题讨论】:

  • 发送到视图的模型是模型列表。您的表单正在发布一个单一的模型。
  • @pcalkins:确认。这段代码非常混乱。 OP 实际上只发布了一个Model。每次迭代都是一个单独的表单。
  • @ChrisPratt 尝试了上述方法,但这导致没有绑定,我得到一个没有项目的列表,
  • 发布你的构造函数...控制器代码不完整。
  • 您将在表单输入上有不同的 id... 它会有一个索引,因为视图模型是一个列表。布尔值/复选框/单选按钮在 asp.net 中非常古怪,我认为即使没有值,它也只是默认为 false。

标签: c# asp.net .net asp.net-core model-binding


【解决方案1】:

当我使用单选按钮切换提交表单时,只有 IsEnabled 属性被绑定到 POST。

IsEnable 属性的false 值不是模型绑定传递的,而是bool 的默认值。

当页面源有模型值时,为什么它没有反映在 POST 上?

我重现了您的问题,您需要为输入指定 name 属性,以对应于您操作的参数 Model 的属性。否则模型绑定在您的情况下将不起作用。

@try
{
    <form asp-action="UWTest" asp-controller="Test" method="post">
        <div class="switch switch--horizontal switch--no-label ">
            <input asp-for="@Model[item].IsEnabled" type="radio" name="IsEnabled" value="@Model[item].IsEnabled" class="form-control" />
            <input asp-for="@Model[item].IsEnabled" type="radio" name="IsEnabled" value="false" class="form-control" />
            <span class="toggle-outside"><span class="toggle-inside"></span></span>
        </div>

        <input type="hidden" asp-for="@Model[item].Id" value="@Model[item].Id" name="Id"/>
        <input type="hidden" asp-for="@Model[item].WId" value="@Model[item].WId" name="WId"/>
        <input type="hidden" asp-for="@Model[item].UId" value="@Model[item].UId" name="UId" />

    </form>
}
catch (Exception e)
{
    var s = e.Message;
}

【讨论】:

  • 以上工作!!但是,单选按钮的值始终为 false。但是,我使用 jquery 对表单进行了序列化,并且无线电输入正确绑定,即 - true 时为 true,false 时为 false。
猜你喜欢
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
相关资源
最近更新 更多