我在根据返回的项目从数据库中验证所选用户时遇到问题。我找到了一个解决方案,但我并不认为它是正确的(即使它正常工作)。
这是正在发生的事情(简化) 我有以下类连接到数据库:
public class Company
{
[Key]
public int Id { get; set; }
public string CompanyName { get; set; }
public string Description { get; set; }
public ApplicationUser CEO { get; set; }
}
这意味着一家公司可以拥有一名CEO(一家公司的所有者),但CEO可以拥有多家公司(不同的故事,现在只是解释)。
然后我有一个控制器 CompaniesController
,如下所示:
public IActionResult Index()
{
var items = _context.Companies.Include(n=>n.CEO).ToList();
return View(items);
}
返回数据库中所有公司的List<Company>
。此外,如果我不输入.Include(n=>n.CEO)
,那么CEO字段将为空。
最后在查看上,我有以下内容:
@foreach (var item in Model)
{
<tr>
<td>@item.CompanyName</td>
<td>@item.Description</td>
@if (@item.CEO?.Email == User.Identity.Name)
{
//Show edit button for CEO
<td><a asp-action="Edit" asp-route-id="@item.Id">Edit</a></td>
}
else
{
//Logged user is not expected user therefore insert empty column and do not show button
<td></td>
}
</tr>
}
我如何通过比较他们的电子邮件地址(用户需要被授权进入此页面,因此他将始终登录)来检查我的模型中返回的CEO
是否被主动登录用户的方式。< / p>
问题:如果在List<Company>
中检查每个项目的活跃用户是否为首席执行官,是否有更好,更优雅的方法?或者这是一种正确的方法吗?
此外,我将用户数据存储到Company
数据库表的方式是否正确?我采用了本机身份模型,它在数据库中自动生成4或5个身份表,因此当我在SQL数据库中检查我的CEO字段时,我发现这只是对UserId
的引用。
对此事项的任何帮助/建议都不胜感激。
答案 0 :(得分:1)
1:您可以编写一个将在
上返回的辅助方法def method(signed_in_user, company_id)
# it will return if the user is CEO of that company id or Not
end
2:您可以使过滤器显示所有公司和拥有的公司像启动数据切换。
3:您可以进行两次数据库调用 1:user.companies(他是首席执行官) 2:companies.where(signed_in用户不是首席执行官) 写你的for循环。
我不参与C#编程,但这种模式可能会有所帮助