C# 从.net core中的layout.cshtml访问数据库
我的模型中有一组用户,如下所示:C# 从.net core中的layout.cshtml访问数据库,c#,.net,asp.net-core,C#,.net,Asp.net Core,我的模型中有一组用户,如下所示: [Key] [Required] public int ID { get; set; } [ForeignKey("Employee")] public int? EmployeeID { get; set; } public int? CompanyID { get; set; } public string UserID { get; set; }
[Key]
[Required]
public int ID { get; set; }
[ForeignKey("Employee")]
public int? EmployeeID { get; set; }
public int? CompanyID { get; set; }
public string UserID { get; set; }
[DataType(DataType.Text)]
public string Firstname { get; set; }
[DataType(DataType.Text)]
public string Middlenames { get; set; }
[DataType(DataType.Text)]
public string Lastname { get; set; }
[DataType(DataType.Text)]
public string Address { get; set; }
[DataType(DataType.Text)]
public string Postnumber { get; set; }
[DataType(DataType.Text)]
public string City { get; set; }
[DataType(DataType.Text)]
public string Phone { get; set; }
[DataType(DataType.EmailAddress)]
[Required]
public string Email { get; set; }
[DataType(DataType.DateTime)]
public DateTime CreatedDate { get; set; }
[DataType(DataType.DateTime)]
public DateTime EditedDate { get; set; }
[DataType(DataType.DateTime)]
public DateTime CurrentLoginTime { get; set; }
[DataType(DataType.DateTime)]
public DateTime LastLoginTime { get; set; }
public virtual Employee Employee { get; set; }
public virtual Company Company { get; set; }
using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace TimePlus.Data
{
public class ApplicationUser : IdentityUser
{
public string Fullname { get; set; }
public int? CompanyID { get; set; }
public int? EmployeeID { get; set; }
}
}
我想做的是根据companyID是否有值在布局文件中显示一个菜单项
在MVC5中,我可以在瞬间完成这项工作,但在.NETCore中,我不知道如何继续或搜索什么
我希望这里的人能告诉我,这是如何工作的,我应该如何做:-)您可以创建一个
视图包。IsCompanyOwnerMenuVisible
并将您的逻辑分配给它:
控制器:
然后在您的视图中:
视图:
或者您可以直接在内部视图中进行检查:
@if(Model.CompanyID.HasValue)
{
//Your menu code here
}
您可以创建一个
ViewBag.IsCompanyOwnerMenuVisible
,并将您的逻辑分配给它:
控制器:
然后在您的视图中:
视图:
或者您可以直接在内部视图中进行检查:
@if(Model.CompanyID.HasValue)
{
//Your menu code here
}
您可以在这里创建一些服务(并将其注册到DI容器中),这些服务可以帮助您了解您的情况。然后,您可以将该服务注入到视图中,并对其调用一个方法来检查值:
@inject MyUserService myUserService
@if (await myUserService.GetIsCompanyOwnerAsync(User))
{
<div>Item for company owner</div>
}
您可以在这里创建一些服务(并将其注册到DI容器中),这些服务可以帮助您了解您的情况。然后,您可以将该服务注入到视图中,并对其调用一个方法来检查值:
@inject MyUserService myUserService
@if (await myUserService.GetIsCompanyOwnerAsync(User))
{
<div>Item for company owner</div>
}
我最终创建了一个ApplicationUser类,它继承了IdentityUser。然后,我可以将IdentityUser在项目中弹出的所有位置更改为ApplicationUser 然后,我在applicationUser中添加了所需的属性,使用Add migration添加了迁移,并更新了数据库 我的ApplicationUser类如下所示:
[Key]
[Required]
public int ID { get; set; }
[ForeignKey("Employee")]
public int? EmployeeID { get; set; }
public int? CompanyID { get; set; }
public string UserID { get; set; }
[DataType(DataType.Text)]
public string Firstname { get; set; }
[DataType(DataType.Text)]
public string Middlenames { get; set; }
[DataType(DataType.Text)]
public string Lastname { get; set; }
[DataType(DataType.Text)]
public string Address { get; set; }
[DataType(DataType.Text)]
public string Postnumber { get; set; }
[DataType(DataType.Text)]
public string City { get; set; }
[DataType(DataType.Text)]
public string Phone { get; set; }
[DataType(DataType.EmailAddress)]
[Required]
public string Email { get; set; }
[DataType(DataType.DateTime)]
public DateTime CreatedDate { get; set; }
[DataType(DataType.DateTime)]
public DateTime EditedDate { get; set; }
[DataType(DataType.DateTime)]
public DateTime CurrentLoginTime { get; set; }
[DataType(DataType.DateTime)]
public DateTime LastLoginTime { get; set; }
public virtual Employee Employee { get; set; }
public virtual Company Company { get; set; }
using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace TimePlus.Data
{
public class ApplicationUser : IdentityUser
{
public string Fullname { get; set; }
public int? CompanyID { get; set; }
public int? EmployeeID { get; set; }
}
}
在我的布局中,我可以调用以下属性:
<li>
<a asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">
Hello @user.Fullname
</a>
</li>
希望这能帮助其他人:-)
我在“poke”的回答上做了标记,因为这是他指向让我在谷歌上搜索的主张的指针;-) 我最终创建了一个ApplicationUser类,该类继承自IdentityUser。然后,我可以将IdentityUser在项目中弹出的所有位置更改为ApplicationUser
然后,我在applicationUser中添加了所需的属性,使用Add migration添加了迁移,并更新了数据库
我的ApplicationUser类如下所示:
[Key]
[Required]
public int ID { get; set; }
[ForeignKey("Employee")]
public int? EmployeeID { get; set; }
public int? CompanyID { get; set; }
public string UserID { get; set; }
[DataType(DataType.Text)]
public string Firstname { get; set; }
[DataType(DataType.Text)]
public string Middlenames { get; set; }
[DataType(DataType.Text)]
public string Lastname { get; set; }
[DataType(DataType.Text)]
public string Address { get; set; }
[DataType(DataType.Text)]
public string Postnumber { get; set; }
[DataType(DataType.Text)]
public string City { get; set; }
[DataType(DataType.Text)]
public string Phone { get; set; }
[DataType(DataType.EmailAddress)]
[Required]
public string Email { get; set; }
[DataType(DataType.DateTime)]
public DateTime CreatedDate { get; set; }
[DataType(DataType.DateTime)]
public DateTime EditedDate { get; set; }
[DataType(DataType.DateTime)]
public DateTime CurrentLoginTime { get; set; }
[DataType(DataType.DateTime)]
public DateTime LastLoginTime { get; set; }
public virtual Employee Employee { get; set; }
public virtual Company Company { get; set; }
using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace TimePlus.Data
{
public class ApplicationUser : IdentityUser
{
public string Fullname { get; set; }
public int? CompanyID { get; set; }
public int? EmployeeID { get; set; }
}
}
在我的布局中,我可以调用以下属性:
<li>
<a asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">
Hello @user.Fullname
</a>
</li>
希望这能帮助其他人:-)
我在“poke”的回答上做了标记,因为这是他指向让我在谷歌上搜索的主张的指针;-) 什么是IsCompanyOwner
?它不是用户对象的属性。@model user和@if(model.IsCompanyOwner){}。这与asp MVCAre相同,您询问如何在layout.cshtml
(坏主意)中执行控制器的工作,或者如何访问其中的模型?为什么布局文件需要了解特定控制器的模型?这是控制器视图的工作,或者是我也看不到的Razor页面。但也许你在文件顶部有一个@injectusermanager-UserManager
帮助。我编辑了这篇文章,因为“IsCompanyOwner”是另一个模型的一部分。如果在UserInfo模型中为当前登录的用户设置了Companyid,则我要做的是根据隐藏或显示菜单项;-)什么是IsCompanyOwner
?它不是用户对象的属性。@model user和@if(model.IsCompanyOwner){}。这与asp MVCAre相同,您询问如何在layout.cshtml
(坏主意)中执行控制器的工作,或者如何访问其中的模型?为什么布局文件需要了解特定控制器的模型?这是控制器视图的工作,或者是我也看不到的Razor页面。但也许你在文件顶部有一个@injectusermanager-UserManager
帮助。我编辑了这篇文章,因为“IsCompanyOwner”是另一个模型的一部分。如果在UserInfo模型中为当前登录的用户设置了Companyid,则我要做的是根据隐藏或显示菜单项;-)然后,我必须在每个使用该布局的控制器中设置该viewbag?还是有更聪明的方法?(可能是我不了解核心是如何工作的;-))你的共享模型是你的视图模型吗?检查更新的答案。我不确定如何将模型传递到layout.cshtml?无法从布局视图访问控制器中的Viewbag和viewdata。它们只返回null,这可能是因为在创建viewbag之前布局呈现。在这种情况下,您可以创建基本控制器,并从基本控制器派生所有公共控制器,然后在该控制器内可以重写OnActionExecuting
方法,在你的控制器中,我需要在每个使用该布局的控制器中设置该视图包?还是有更聪明的方法?(可能是我不了解核心是如何工作的;-))你的共享模型是你的视图模型吗?检查更新的答案。我不确定如何将模型传递到layout.cshtml?无法从布局视图访问控制器中的Viewbag和viewdata。它们只返回null,这可能是因为在创建viewbag之前布局呈现。在这种情况下,您可以创建基本控制器,并从基本控制器派生所有公共控制器,然后在该控制器内可以重写OnActionExecuting
方法,或者在控制器内部重写执行的操作。我最终创建了一个从IdentityUser继承的applicationUser模型,然后添加了我需要的属性:-)我最终创建了一个从IdentityUser继承的applicationUser模型,然后添加了我需要的属性:-)