我在根据返回的项从数据库对选定用户进行身份验证时遇到问题。我已经找到了一个解决方案,但是我并不认为它是正确的(尽管它是有效的)。
下面是正在发生的事情(简化)。
我有以下类连接到数据库:
public class Company
{
[Key]
public int Id { get; set; }
public string CompanyName { get; set; }
public string Description { get; set; }
public ApplicationUser CEO { get; set; }
}这意味着一家公司可以有一位首席执行官(一家公司的所有者),但首席执行官可以有多家公司(目前情况不同,只是解释一下)。
然后我有一个Controller CompaniesController,如下所示:
public IActionResult Index()
{
var items = _context.Companies.Include(n=>n.CEO).ToList();
return View(items);
}返回数据库中所有公司的List<Company>。此外,如果我不进入.Include(n=>n.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>中每一项的首席执行官,或者这是一种正确的方法?
此外,我将用户数据存储到Company数据库表的方式正确吗?我采用了本机标识模型,它在数据库中自动生成4或5个标识表,因此,当我在SQL数据库中检查我的首席执行官字段时,我可以看到这只是对UserId的引用。
如能就此事提供任何帮助/建议,将不胜感激。
发布于 2017-01-06 11:39:02
1:您可以编写将返回的助手方法。
def method(signed_in_user, company_id)
# it will return if the user is CEO of that company id or Not
end他说:你可以让过滤器显示所有的公司和拥有的公司,如引导数据切换。
3:您可以进行两个数据库调用: 1: user.companies(他是首席执行官) 2: companies.where(signed_in用户不是首席执行官)编写您的for循环。
我不喜欢C#编程,但这种模式可能会有所帮助。
https://stackoverflow.com/questions/41503647
复制相似问题