【问题标题】:Properly use bootstrap switch which call c# function (T4MVC/Entity Framework)正确使用调用 c# 函数的引导开关(T4MVC/Entity Framework)
【发布时间】:2016-02-13 08:49:13
【问题描述】:

没有代码我找不到可以解释的词,所以这是我目前得到的:

查看:(引导开关)

[...]
    @foreach (var item in Model)
                {
                    <tr>
                        <td>
                            <input class="my-checkbox" type="checkbox" name="my-checkbox" id="@(item.Id)" data-handle-width="100" data-on-text="Activer" data-off-text="Désactiver" data-size="small" data-on-color="success">
                        </td>
                    </tr>
                }
[...]
    <script type="text/javascript">
        var isEnableUrl = '@Url.Action("IsEnabledMaterial", "MaterialType")';
        $("[name='my-checkbox']").bootstrapSwitch();
    </script>

Javascript:

$(document).ready(function () {
    $('.my-checkbox').each(function (index) {
        $.ajax({
            type: 'POST',
            url: isEnableUrl,
            data: { 'id': index },
            success: function (result) {
                $('.my-checkbox').prop('checked', result);
            },
            error: function (e) {
                swal("Error", "Can't modify that element. ", "error");
            }
        });
    });
});

然后是我的控制器:

[HttpPost]
public virtual bool IsEnabledMaterial(int id)
{
     var materialType = materialTypeRepository.GetById(id);
     return materialType.Enable;
}

所以基本上,我想要做的是在页面加载时,当我所有的“开关”都被创建后,我想去我的数据库中查看哪个开关必须是真或假,并且将它们设置为正确的值...

但是当我尝试这样做时,我会在 id = 0 时得到 NullReferenceException。我想这是正常的,因为在我的数据库中,id 是 1、2、3 和 4。但是如果我增加通过一个 id,当 id = 4 时,我得到相同的错误。在每种情况下,它们都没有切换为 true(它们在数据库中都是 true)。如果我手动执行(没有 .each),它只会工作(对于 ids 1-2-3),id: 0-4 仍然无法执行我想要的操作。

可能与foreach有关吗?因为我尝试传递 id "@(item.Id + 1)" 但仍然得到一个 0...

非常感谢您的帮助!

【问题讨论】:

  • 如果你这样做,你会遇到性能问题。您在 foreach 中有多个 ajax 调用。您可以在 foreach 循环中构造一个字典类型对象,然后将其发布到您的控制器一次,然后为每个 id 获取真/假,而不是这样做。

标签: javascript c# entity-framework t4mvc bootstrap-switch


【解决方案1】:

我看到至少三个问题:

  1. 您输入的 id 以数字开头。从技术上讲,id 不应以数字开头。尝试将其更改为

&lt;input class="my-checkbox" type="checkbox" name="my-checkbox" id="@("chkBox" + item.Id)" data-handle-width="100" data-on-text="Activer" data-off-text="Désactiver" data-size="small" data-on-color="success"&gt;

  1. 您的主要问题应该是

$('.my-checkbox').prop('checked', result);

这会将带有 class="my-checkbox" 的所有输入更改为 ajax 调用的最后一个结果。您可能想将其更改为

$('#chkBox' + index).prop('checked', result);
  1. 您将遇到性能问题,因为此实现中的 ajax 调用太多

【讨论】:

  • 你说得对,它更有意义!我仍然在 GetById 上的 EfEntityRepositery 类中遇到错误,如果我手动执行,我将不会得到这个错误......对于我正在尝试做的事情,您可能有一个更好的解决方案,而无需使用太多的 ajax 调用?
  • 实际上我在想我可以调用一个函数,它会返回一个“激活”元素列表,而不是在成功方法中检查它们
  • 您可以返回 id 的 JSON 数组来指示选中状态并使用 javascript array.forEach(function(id){ $("#chkBox" + id).prop("checked",真)})
  • 你做得很好!坦克给了我这个提示哈哈
猜你喜欢
  • 2019-12-15
  • 2012-12-31
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多