Entity Framework 通过 UserId 获取文档
Entity Framework Get Document by UserId
我有一个继承默认身份的项目和用户模型 class。
这两个共享多对多关系。
public class Project
{
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public ICollection<AppUser> users { get; set; }
}
public class AppUser : IdentityUser
{
public string DisplayName { get; set; }
public ICollection<Project> projects { get; set; }
}
我还有一个项目控制器,我想在其中显示包含当前用户的所有项目。 (项目可以有多个用户)
我也希望能够创建项目。
[Authorize]
public IActionResult Index(string id)
{
IEnumerable<Project> objProjectList = _unitOfWork.Project.GetAll();
return View(objProjectList);
}
我首先通过像这样的锚标记传递用户 ID。
<a class="nav-link text-dark"
asp-area="" asp-controller="Project" asp-action="Index"
asp-route-id="@UserManager.GetUserId(User)">Projects</a>
如何使用id获取我的项目控制器中只包含id对应用户的项目?
如何使用相同的 ID 创建一个项目,用户附加在同一控制器中的 post 路由上?
我是否应该避免通过锚标记传递用户 ID 等敏感数据并通过其他方式获取用户 ID?
如果有任何意见,我将不胜感激。
您可以尝试这样的操作。但是使用 ViewModels 保护你的数据库是个好主意。此外,您的所有逻辑都应该在服务 class 中,而不是在控制器中。您传递 Id 的方式完全没问题。
public interface IProjectService
{
IEnumerable<Project> GetAllProjectsByUserId(object userId);
}
public class ProjectService : IProjectService
{
public IEnumerable<Project> GetAllProjectsByUserId(string userId)
{
return _unitOfWork.Project.Where(x => x.users.Any(x =>
x.Id = userId)).ToList();
}
}
将Service提供给StartUp中的依赖容器class
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IProjectService , ProjectService >();
}
然后在Controller中调用Service
private readonly IProjectService projectService;
public ControllerName(IProjectService projectService)
{
this.projectService = projectService;
}
[Authorize]
public IActionResult Index(string id)
{
var viewModel = projectService.GetAllProjectsByUserId(id);
return View(objProjectList);
}
还有更多的事情要做,例如存储库、dtos eg,但这对于开始是一个很好的选择
我有一个继承默认身份的项目和用户模型 class。
这两个共享多对多关系。
public class Project
{
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public ICollection<AppUser> users { get; set; }
}
public class AppUser : IdentityUser
{
public string DisplayName { get; set; }
public ICollection<Project> projects { get; set; }
}
我还有一个项目控制器,我想在其中显示包含当前用户的所有项目。 (项目可以有多个用户) 我也希望能够创建项目。
[Authorize]
public IActionResult Index(string id)
{
IEnumerable<Project> objProjectList = _unitOfWork.Project.GetAll();
return View(objProjectList);
}
我首先通过像这样的锚标记传递用户 ID。
<a class="nav-link text-dark"
asp-area="" asp-controller="Project" asp-action="Index"
asp-route-id="@UserManager.GetUserId(User)">Projects</a>
如何使用id获取我的项目控制器中只包含id对应用户的项目?
如何使用相同的 ID 创建一个项目,用户附加在同一控制器中的 post 路由上?
我是否应该避免通过锚标记传递用户 ID 等敏感数据并通过其他方式获取用户 ID?
如果有任何意见,我将不胜感激。
您可以尝试这样的操作。但是使用 ViewModels 保护你的数据库是个好主意。此外,您的所有逻辑都应该在服务 class 中,而不是在控制器中。您传递 Id 的方式完全没问题。
public interface IProjectService
{
IEnumerable<Project> GetAllProjectsByUserId(object userId);
}
public class ProjectService : IProjectService
{
public IEnumerable<Project> GetAllProjectsByUserId(string userId)
{
return _unitOfWork.Project.Where(x => x.users.Any(x =>
x.Id = userId)).ToList();
}
}
将Service提供给StartUp中的依赖容器class
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IProjectService , ProjectService >();
}
然后在Controller中调用Service
private readonly IProjectService projectService;
public ControllerName(IProjectService projectService)
{
this.projectService = projectService;
}
[Authorize]
public IActionResult Index(string id)
{
var viewModel = projectService.GetAllProjectsByUserId(id);
return View(objProjectList);
}
还有更多的事情要做,例如存储库、dtos eg,但这对于开始是一个很好的选择