【问题标题】:MVC Razor For loop binding to ViewModel problemMVC Razor For 循环绑定到 ViewModel 问题
【发布时间】:2018-09-30 11:29:07
【问题描述】:

我看到一个令人困惑的问题,将我的视图模型发回我的控制器,我对它为什么不工作感到困惑。虽然我知道为什么它可能无法正常工作,但我在底部附近进行了解释。

基本上我使用 for 循环将我的模型绑定到剃刀视图中的 HTML

           @for (int i = 0; i < Model.CheckBoxTag.Count; i++)
            {
                @if (Model.CheckBoxTag[i].TagTypeName == "test")
                {
                    ....
                }
            }

当我提交表单时,测试 CheckBoxTag 对象会按预期发送到我的控制器。

但是,当我只使用升级标签在 html 页面下方执行相同操作时:-

            @for (int i = 0; i < Model.CheckBoxTag.Count; i++)
            {
                @if (Model.CheckBoxTag[i].TagTypeName == "test1")
                {
                        ...
                }

            }

test1 CheckBoxTag 对象不会发送回控制器。 (计数仍然是 3,而应该是 6)

事实上它是相同的代码,我不确定如何处理它。

我的理论:我相信它不会发回我的控制器,因为测试循环是集合中的第一个元素,因此它总是进入 IF。而 test1 对象靠近集合的底部,因此 IF 在循环中被跳过了好几次。

正确吗?如果不是,可能是什么问题?

谢谢

【问题讨论】:

  • 集合索引器必须从零开始并且是连续的(除非您包含索引器的输入)。您的 if 块意味着您可能没有生成连续的索引器。您需要在视图中显示数据(特别是 TagTypeName 属性的值
  • 你的索引会重叠
  • @StephenMuecke 我是这么认为的,尽管您的解释比我的要简洁得多。感谢您的确认。

标签: c# asp.net-mvc razor asp.net-core-mvc viewmodel


【解决方案1】:

如 cmets 部分所述,索引器必须是连续的。

因此在我放的 for 循环中

     @for (int i = 0; i < Model.CheckBoxTag.Count; i++)
        {


            @if (Model.CheckBoxTag[i].TagTypeName == "test1")
            {
                // New!
                <input type="hidden" name="CheckBoxTag.Index" value="@i" />
                    ...
            }

        }

所以现在索引器“[i]”现在在每个循环中都递增

【讨论】:

  • 最好在每个循环中添加一个&lt;input type="hidden" name="CheckBoxTag.Index" value="@i" /&gt;
  • 应该在if 块内:)
猜你喜欢
  • 1970-01-01
  • 2011-08-01
  • 2018-11-05
  • 2015-12-19
  • 2022-06-13
  • 2017-11-06
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多