我有以下代码在我的视图中生成动态复选框:
@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>
}
在此应用程序中,我们使用软删除机制,因此如果用户取消选中某个项目,我们只需使用IsDeleted
将true
设置为_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);
}
}
}
现在我可以取消选中项目,但它没有检查过它们,因为它们存在于数据库中且IsDeleted
设置为1
。
答案 0 :(得分:1)
乍一看,您的所有复选框看起来都有一个名称name="Profile.InterestIds"
。这可能是一个问题。
答案 1 :(得分:1)
我很确定这是因为你的双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); }
第一个删除所有数据,第二个重新添加数据。
您的代码当前删除了所有存在的内容,然后添加了不存在的内容或删除了仍然存在的内容。
这段代码对我没有意义。我这样读了
浏览ID并删除所有存在的内容,现在什么都没有 存在于
中_memberInterestService
然后再次浏览所有ID并添加所有不具备的ID 存在,如果某些东西仍然存在,则将其删除,使其不存在 再