我在根据返回的项对数据库中的选定用户进行身份验证时遇到问题。我找到了一个解决方案,但我并不认为它是正确的(尽管它正在发挥作用)。
以下是正在发生的事情(简化)
我有以下类连接到数据库:
public class Company
{
[Key]
public int Id { get; set; }
public string CompanyName { get; set; }
public string Description { get; set; }
public ApplicationUser CEO { get; set; }
}
这意味着一家公司可以有一个首席执行官(一家公司的所有者),但首席执行官可以有多个公司(不同的故事,现在只是解释一下)。
然后我有一个控制器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
是否是主动登录用户的方式是通过比较他们的电子邮件地址(用户需要获得进入此页面的授权,因此他将始终登录)。
问题:有没有更好、更优雅的方法来检查活动用户是否是List<Company>
中每个项目的CEO,或者这是一种正确的方法?
此外,我将用户数据存储到Company
数据库表的方式正确吗?我采用了原生身份模型,它会自动在数据库中生成4或5个身份表,因此当我在SQL数据库中检查我的CEO字段时,我可以看到这只是对UserId
的引用。
在这方面的任何帮助/建议都将不胜感激。
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:用户。公司(他担任首席执行官的地方)2:公司。其中(signed_in用户不是ceo)编写for循环。
我不喜欢C#编程,但这种模式可能有助于