2015-11-12 98 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)}) –