【问题标题】:Updating database based on selected check boxes根据选中的复选框更新数据库
【发布时间】:2017-01-12 01:42:01
【问题描述】:

我有以下代码在我的视图中生成动态复选框:

@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>
}

在此应用程序中,我们使用软删除机制,因此如果用户取消选中某个项目,我们只需使用 _memberInterestService.Delete(id, item.Id, true); 将 IsDeleted 设置为 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。

【问题讨论】:

  • 无法从代码中看出,在服务器上如何确定复选框是选中还是未选中?
  • @ChetanRanpariya 如果选中复选框,模型绑定器会为我提供它们的值,否则它们将是 null

标签: c# linq


【解决方案1】:

乍一看,您的所有复选框似乎都有一个名称name="Profile.InterestIds"。这可能是个问题。

【讨论】:

  • 这个过程适用于添加新项目,问题是,当用户想要取消选中一个项目时,什么都没有发生。
  • 什么都没有发生?如果用户取消选中一项,您不会将其设为 null?
  • @ChetanRanpariya 不,实际上提交表单后不会取消选中该项目。
【解决方案2】:

我相当肯定这是因为你的双 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 并添加所有没有的 存在,如果某些东西仍然存在,则将其删除,使其不存在 没有了

【讨论】:

  • 这段代码删除了存储在数据库中的所有现有项目,删除我的意思是_memberInterestService.Delete(id, item.Id, true);
  • 您的代码当前删除所有存在的内容,然后添加不存在的内容或删除仍然存在的内容...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 2014-04-26
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
相关资源
最近更新 更多