首页 > 解决方案 > 将字符串列表更新为模型属性

问题描述

我有这堂课:

public class Soup
{
    public int Id { get; set; }
    public string SoupName { get; set; }
    // other properties
}

我有一个允许批量更新 SoupName 属性的视图。我的控制器中的 IActionResult 正确接收修改后的值:

public IActionResult QuickEdit(List<string> soups)
{
    var soupNames = _soupRepository.AllSoups.Select(s => s.SoupName).ToList();

    for (var i = 0; i < soupNames.Count; i++)
    {
        soupNames[i] = soups[i];
    }

    _soupRepository.UpdateSoupNames(soups);
    return View(soups);
}

但我坚持使用 UpdateSoupNames 方法,我不知道如何只更新我的 Soup 对象的 SoupNames。我已经尝试了几件事,但是当我调用 _appDbContext.SaveChanges(); 没有任何东西被保存或更新。通过的汤是更新的。我只是无法将其正确保存到我的数据库中。在我尝试过的最新内容下方:

    public void UpdateSoupNames(List<string> soups)
    {
        for(var i = 0; i < soups.Count; i++)
        {
            _appDbContext.Soups.Where(c => c.Id == i).ToList().Select(s => { s.SoupName = soups[i]; return s; });                      
        }
        _appDbContext.SaveChanges();

    }

所以问题是,如何更新和保存作为字符串列表传递的字符串值。我需要更新并保存我的 SoupName 属性上的所有修改值。

标签: c#listentity-framework-coreasp.net-core-mvcasp.net-core-3.1

解决方案


我不明白您在下面的这种方法中尝试做什么?你得到了 soupNames 并更新了它们,但是不使用结果?

public IActionResult QuickEdit(List<string> soups)
{
    var soupNames = _soupRepository.AllSoups.Select(s => s.SoupName).ToList();

    for (var i = 0; i < soupNames.Count; i++)
    {
        soupNames[i] = soups[i];
    }

    _soupRepository.UpdateSoupNames(soups);
    return View(soups);
}

最佳实践是将完整模型(带有 id)传递给控制器​​,如果您只想“修补”汤名称,则模型中只会包含名称。但是,为了最小的变化,我会更新它以执行以下操作:

public IActionResult QuickEdit(List<string> soups)
{
    var models = _soupRepository.AllSoups.ToList();

    for (var i = 0; i < soupNames.Count; i++)
    {
        models[i].SoupName = soups[i];
    }

    _soupRepository.UpdateSoupNames(models);
    return View(soups);
}

将完整模型传递给您的存储库将使 Repository 方法更具可重用性,正如我上面所说,如果您将 Id 与名称一起传递会更好。


推荐阅读