【问题标题】:ASP.NET MVC: How to delete element from List that is also in ListASP.NET MVC:如何从列表中删除也在列表中的元素
【发布时间】:2021-02-12 02:43:57
【问题描述】:

我有一份酿酒商清单,每个酿酒商都有一份啤酒清单。在我的练习中,我需要从特定的 Brewer 中删除 Beer。

我看到了 Brewers 列表,我点击了详细信息,然后我看到了这个 brewer 拥有的所有 Beers 的名称。

我了解如何删除 Brewer,但不知道如何从该 Brewer 中删除啤酒。我绝对需要啤酒厂的身份证和啤酒的身份证。

 <td>
    <a asp-controller="Brewer" asp-action="BeerDelete" asp-route-id="@item.BeerId">Delete</a>
</td>

这里我有一个啤酒 id,但我如何设法再次获得 Brewer id?

这是删除 Brewer 的代码

[HttpPost, ActionName("Delete")]
    public IActionResult DeleteConfirmed(int id)
    {
        Brewer brewer = null;
        try
        {
            brewer = _brewerRepository.GetBy(id);
            _brewerRepository.Delete(brewer);
            _brewerRepository.SaveChanges();
            TempData["message"] = $"You successfully deleted brewer { brewer.Name}.";
        }
        catch
        {
            TempData["error"] = $"Sorry, something went wrong, brewer { brewer?.Name} was not deleted…";
        }
        return RedirectToAction(nameof(Index));
    }

我可能需要在某处保存 brewer 的 id 吗? 或者当我在他的页面上查看啤酒列表时,有可能获得啤酒商的 ID?

删除 Brewer 网址:…/Brewer/Delete/4

删除啤酒 网址:.../Brewer/Beer/Delete/{id} ???? 希望我描述得足够好..

我试着这样做:

public IActionResult BeerDelete(int id)
    {
        ViewData[nameof(Beer.Name)] = _brewerRepository.GetBy(id).Beers.FirstOrDefault(e => e.BeerId == id).Name;
        return View();
    }

How I did this

亲切的问候,伊利亚

【问题讨论】:

  • 最好创建一个视图模型而不是 ViewData。然后您可以在您的视图中创建一个表单并发布该模型。在模型中,您可以添加一个 brewerId 和一个 beerId 也不清楚您的数据库是如何构建的。您是否使用实体框架并且是代码优先?这完全取决于数据库中两者之间的关系以及如何构建。
  • 您好,谢谢回复,是实体框架,代码优先,Brewer有0个或多个Beers,Beer正好有一个Brewer。
  • 那么啤酒中有没有 brewerId ?那将是可取的。你可以这样做:_beerRepository.Where(b => b.BrewerId == brewerId && b.Id == Id).FirstOrDefault();
  • 我不能使用 _beerRepository.. 我只有私有的只读 IBrewerRepository _brewerRepository;私有只读 ILocationRepository _locationRepository;公共 BrewerController(IBrewerRepository brewerRepository, ILocationRepository locationRepository) { _brewerRepository = brewerRepository; _locationRepository = locationRepository; } 在我的练习中

标签: c# asp.net-mvc razor model-binding


【解决方案1】:

这是从您的啤酒机中删除啤酒的众多方法之一。我假设您的啤酒上有一个ForeignKey 供酿酒商使用。如果我真的知道 BrewerBeer 类是如何设置的,我会更准确。

查看

 <td>
    <a asp-controller="Brewer" asp-action="BeerDelete" asp-route-id="@item.BeerId" asp-route-brewerId="@item.BrewerId">Delete</a>
</td>

控制器

public IActionResult BeerDelete(int id, int brewerId)
    {
        // This would select the beer and pass it into the view as the view's model.
        // Brewer should also be populated for this beer.
        var beer = _brewerRepository.GetBy(brewerId).Beers.FirstOrDefault(e => e.BeerId == id);
        return View(beer);
    }

【讨论】:

  • 在您的帮助下,我几乎接近了;但是一类 Beer 对 Brewer 一无所知,所以我没有属性 brewerId,一个 brewer 类得到了 Beers 列表。我这里有 Brewer 和 Beer 的模型图 github.com/pl7771/Beerhall---.net-MVC-with-Moq-testings/tree/…
  • 我认为@patrick-mcvay 对您的帮助很大,完成您的练习取决于您,否则我们将代替您进行练习。您需要包含 brewerId,并且在导航到啤酒页面之前,您已经在 brewer 页面上。
  • 签入Shadow Properties。由于Beer 没有Brewer 的外键或Brewer 的导航属性,如果您使用代码优先方法,Entity Framework 将为您创建一个Shadow Propertydocs.microsoft.com/en-us/ef/core/modeling/…
  • 另外,我会在你的 DBContext 类中设置一个 DBSet&lt;Beer&gt;
猜你喜欢
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 2010-10-13
  • 2019-02-04
  • 2020-09-28
相关资源
最近更新 更多