2015-11-12 93 views
0

我无法用言语来无码解释,所以这里就是我有这么远:正确使用的调用C#函数(T4MVC /实体框架)自举开关

查看:(引导开关)

[...] 
    @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; 
} 

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

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

它可能与foreach?因为我试图通过ID“@(item.Id + 1)”,仍然得到0一次...

非常感谢您的帮助!

+0

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

回答

0

我看到至少有三个问题:

  1. 您的ID与许多输入开始。从技术上讲,ID不应该以数字开头。尝试将其更改为

<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">

  • 你的主要问题应该是
  • $('.my-checkbox').prop('checked', result);

    这将改变所有类输入= “my-checkbox”到ajax调用的最后结果。你可能想将其更改为

    $('#chkBox' + index).prop('checked', result); 
    
  • 您将有性能问题,因为在此实现
  • +0

    你说得对,它更有意义!我仍然在GetById的EfEntityRepositery类中得到一个错误,如果我手动执行它,我不会得到这个错误...您可能有更好的解决方案来处理我想要做的事情,而无需使用太多的Ajax调用? – anthomaxcool

    +0

    其实我只想调用一个函数,它会返回一个“激活”元素列表,并且比成功方法只检查它们 – anthomaxcool

    +0

    您可能会返回一个ID的JSON数组来指示已检查的状态并使用javascript数组。 forEach(function(id){$(“#chkBox”+ id).prop(“checked”,true)}) –