2017-01-09 62 views
1

我有下面的代碼在我看來,以生成動態複選框:更新數據庫基於選中的複選框

@foreach (var sub in Model) 
{ 
    <div class="row"> 
     <div class="col-md-3"> 
      <input type="checkbox" 
        value="@sub.Id" 
        name="Profile.InterestIds" 
        checked="@sub.IsChecked"/> 
     </div> 
     <div class="col-md-6"> 
      @sub.Title 
     </div> 
    </div> 
} 

在這個應用程序,所以如果用戶未選中的項目,我們使用的是軟刪除機制,我們剛剛成立IsDeletedtrue使用_memberInterestService.Delete(id, item.Id, true);。下面是這樣做的過程中,代碼:

public override void Update(UserProfileDto item) 
{ 
    // Getting all Member Interests (where IsDeleted == true) 
    var memberIntersestIds = _memberInterestService.GetAllPlusDeleted(); 
    // List of ids in the database as Guid 
    var dbIds = memberIntersestIds.Select(p => p.InterestSubCategoryId); 
    var union = dbIds.ToList().Union(item.InterestIds); 

    // item.InterestIds is IEnumerable<Guid> (selected check boxes) 
    if (item.InterestIds != null) 
    { 
     var guids = union as Guid[] ?? union.ToArray(); 
     foreach (var id in guids) 
      if (_memberInterestService.IsSubInterestExist(id)) 
       _memberInterestService.Delete(id, item.Id, true); 

     foreach (var id in guids) 
     { 
      if (!_memberInterestService.IsSubInterestExist(id)) 
       _memberInterestService.Add(new MemberInterestDto 
       { 
        UserProfileId = item.Id, 
        InterestSubCategoryId = id 
       }); 
      else 
       _memberInterestService.Delete(id, item.Id, false); 
     } 
    } 
    else 
     foreach (var memberInterest in memberIntersestIds) 
      _memberInterestService.Delete(memberInterest.InterestSubCategoryId, item.Id, true); 
} 

此代碼工作正常,直到用戶提交表單沒有任何反應,此代碼不會從數據庫中刪除未選中項目後,未選中的複選框之一。任何想法?

更新:我得到的代碼工作,通過改變foreach循環一個for循環,因爲每個複選框的ID必須是唯一的:

@for (int i = 0; i < Model.Count(); i++) 
{ 
    <div class="row"> 
     <div class="col-md-3"> 
      <input type="checkbox" id="@i" 
        value="@Model.ElementAt(i).Id" 
        name="Profile.InterestIds" 
        class = "interest-checkbox" 
        checked="@Model.ElementAt(i).IsChecked"/> 
     </div> 
     <div class="col-md-6"> 
      @Model.ElementAt(i).Title 
     </div> 
    </div> 
} 

然後我使用Union來改變方法Except:(also used this suggestions

public override void Update(UserProfileDto item) 
{ 
    var memberIntersestIds = _memberInterestService.GetMyInterestsExceptDeleted(item.Id); 
    if (item.InterestIds != null) 
    { 
     var dbIds = memberIntersestIds.Select(p => p.InterestSubCategoryId); 
     var guids = dbIds.ToList().Except(item.InterestIds).ToArray(); 
     foreach (var id in guids) 
     { 
      if (_memberInterestService.IsSubInterestExist(id, item.Id)) 
      { 
       _memberInterestService.Delete(id, item.Id, true); 
      } 
      else 
      { 
       _memberInterestService.Add(new MemberInterestDto 
       { 
        UserProfileId = item.Id, 
        InterestSubCategoryId = id 
       }); 
      } 
     } 
    } 
    else 
    { 
     foreach (var memberInterest in memberIntersestIds) 
     { 
      _memberInterestService.Delete(memberInterest.InterestSubCategoryId, item.Id, true); 
     } 
    } 
} 

現在我可以未被檢查的項目,但它並沒有檢查他們回來,因爲他們在數據庫中,他們存在設置爲1

+1

無法從代碼中發現,如何確定在服務器中複選框是否已選中或未選中? –

+0

@ChetanRanpariya如果複選框被選中,模型聯編程序會爲我提供它們的值,否則它們將是'null' –

回答

1

初看起來,您的所有複選框都有一個名稱name="Profile.InterestIds"。這可能是一個問題。

+0

此過程適用於添加新項目,問題是,當用戶想要取消選中某個項目時,什麼都不會發生。 –

+0

這是什麼意思「什麼都沒有發生」?如果用戶取消選中一個項目,您沒有將其作爲空值? –

+0

@ChetanRanpariya不,實際上在提交表單後它不會取消選中該項目。 –

0

我是因爲你的雙重的foreach相當肯定它是循環

foreach (var id in guids) 
     if (_memberInterestService.IsSubInterestExist(id)) 
      _memberInterestService.Delete(id, item.Id, true); 

    foreach (var id in guids) 
    { 
     if (!_memberInterestService.IsSubInterestExist(id)) 
      _memberInterestService.Add(new MemberInterestDto 
      { 
       UserProfileId = item.Id, 
       InterestSubCategoryId = id 
      }); 
     else 
      _memberInterestService.Delete(id, item.Id, false); 
    } 

第一個刪除所有數據,並在第二個加回數據。

你代碼當前會刪除存在的所有內容,然後添加不存在的內容或刪除仍存在的內容。

這段代碼對我沒有意義。我的理解是這樣的

經過IDS和刪除存在的一切,現在沒有什麼 存在_memberInterestService

然後通過所有的ID再次去添加不 存在的一切,如果事情確實仍然存在,刪除它,因此它不存在 了

+0

此代碼刪除存儲在數據庫中的所有現有項目,刪除我的意思是'_memberInterestService.Delete(id,item。Id,true);' –

+0

你的代碼目前刪除了所有存在的東西,然後添加不存在的東西或刪除仍存在的東西... – Malachi

+0

我已更新我的問題,請檢查它,謝謝 –