使用 for 循环时前端生成的代码:

    1. <div class="form-check m-1">
    2. <input type="hidden" id="z0__RoleId" name="[0].RoleId" value="819644dc-a9a9-4ef0-98b0-303108399a77" />
    3. <input type="hidden" id="z0__RoleName" name="[0].RoleName" value="Teacher" />
    4. <input class="form-check-input" type="checkbox" data-val="true" data-val-required="The IsSelected field is required." id="z0__IsSelected" name="[0].IsSelected" value="true" />
    5. <label class="form-check-label" for="z0__IsSelected">
    6. Teacher
    7. </label>
    8. </div>
    9. <div class="form-check m-1">
    10. <input type="hidden" id="z1__RoleId" name="[1].RoleId" value="9d57a22f-1d62-4435-abed-edd42926ed83" />
    11. <input type="hidden" id="z1__RoleName" name="[1].RoleName" value="User" />
    12. <input class="form-check-input" type="checkbox" data-val="true" data-val-required="The IsSelected field is required." id="z1__IsSelected" name="[1].IsSelected" value="true" />
    13. <label class="form-check-label" for="z1__IsSelected">
    14. User
    15. </label>
    16. </div>
    17. <div class="form-check m-1">
    18. <input type="hidden" id="z2__RoleId" name="[2].RoleId" value="e7cd3efb-d793-4543-8deb-3c6fdb159715" />
    19. <input type="hidden" id="z2__RoleName" name="[2].RoleName" value="Admin" />
    20. <input class="form-check-input" type="checkbox" data-val="true" data-val-required="The IsSelected field is required." id="z2__IsSelected" name="[2].IsSelected" value="true" />
    21. <label class="form-check-label" for="z2__IsSelected">
    22. Admin
    23. </label>
    24. </div>

    有很明显的 [0]、[1]、[2] 区别。

    使用 foreach 时:

    1. <div class="form-check m-1">
    2. <input type="hidden" id="role_RoleId" name="role.RoleId" value="819644dc-a9a9-4ef0-98b0-303108399a77" />
    3. <input type="hidden" id="role_RoleName" name="role.RoleName" value="Teacher" />
    4. <input class="form-check-input" type="checkbox" data-val="true" data-val-required="The IsSelected field is required." id="role_IsSelected" name="role.IsSelected" value="true" />
    5. <label class="form-check-label" for="role_IsSelected">
    6. Teacher
    7. </label>
    8. </div>
    9. <div class="form-check m-1">
    10. <input type="hidden" id="role_RoleId" name="role.RoleId" value="9d57a22f-1d62-4435-abed-edd42926ed83" />
    11. <input type="hidden" id="role_RoleName" name="role.RoleName" value="User" />
    12. <input class="form-check-input" type="checkbox" id="role_IsSelected" name="role.IsSelected" value="true" />
    13. <label class="form-check-label" for="role_IsSelected">
    14. User
    15. </label>
    16. </div>
    17. <div class="form-check m-1">
    18. <input type="hidden" id="role_RoleId" name="role.RoleId" value="e7cd3efb-d793-4543-8deb-3c6fdb159715" />
    19. <input type="hidden" id="role_RoleName" name="role.RoleName" value="Admin" />
    20. <input class="form-check-input" type="checkbox" id="role_IsSelected" name="role.IsSelected" value="true" />
    21. <label class="form-check-label" for="role_IsSelected">
    22. Admin
    23. </label>
    24. </div>

    大部分 input 标签的 id 和 name 重复的。

    同时调试 ManageUserRoles 的 POST 方法,可以看到传入的 model 是空的,这就是因为模型绑定失效了。

    image.png

    此处模型绑定失效的原因就是 input 标签的 id 和 name 重复了,导致模型绑定无法正常的进行自动转换,也就导致传入的 model 为空。

    for 循环与 foreach 的异同:

    • 对于 for 循环,input 中的 name 名称是唯一的,并会在名称中包含一个整数索引器
    • 因此模型绑器起知道它必须将这些 input 的值映射到指定控制器操作方法的 list 中
    • 而对于 foreach 循环,input 中的 name 名称不是唯一的,因此模型绑定器不知道必须将值映射到列表参数