一、建立ASP.NET Core Web Applicatoin (MVC)项目,而且使用 Individual User Accounthtml
二、建立数据筛选接口 Models->IDataFilter.csgit
public interface IDataFilter { string UserName { get; set; } }
三、建立实体 Models->Book.cs 并继承 IDataFilter接口,并将实体加入到 Data->ApplicatoinDbContext.cs 上下文中.github
public class Book : IDataFilter { public int Id { get; set; } [Display(Name = "书名")] public string Name { get; set; } public string UserName { get; set; } }
public class ApplicationDbContext : IdentityDbContext { public DbSet<Book> Books { get; set; } public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } }
四、利用模板建立Book类的 CRUD界面。在 Controllers文件夹上 右键 选择 Add(新增)->Controller(控制器)数据库
五、自动生成Book的增删改查以后,咱们在这里要作一个细微的修改,由于咱们IDataFilter字段 UserName是系统生成的,因此咱们要修改两个地方浏览器
将BooksController.cs 下的 Create Action(因为只作演示,没有去修改Update页面)里面的 Bind UserName去掉。修改后结果以下ide
并将建立页面 Views->Books->Create.cshtml 中的 UserName 部份备注ui
在母版页添加Book菜单连接 Views->Shared->_Layout.cshtmlthis
六、打开Nuget管理控制台 迁移数据库,并F5运行,点击Book连接。检查一下程序 有没问题。spa
Add-Migration Init //建立迁移文件 Update-Database //更新到数据库
七、因为Book实体实现了IDataFilter,UserName咱们会经过重写ApplicationDbContext的SaveChanges的实现,进行自动填充用户名.因为要获取登陆信息,在ApplicationDbContext中咱们需注入 IHttpContextAccessorcode
public class ApplicationDbContext : IdentityDbContext { private readonly IHttpContextAccessor _httpContextAccessor; public DbSet<Book> Books { get; set; } public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IHttpContextAccessor httpContextAccessor) : base(options) { _httpContextAccessor = httpContextAccessor; } public override int SaveChanges() { FillDataFilterInfo(); return base.SaveChanges(); } public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default) { FillDataFilterInfo(); return base.SaveChangesAsync(cancellationToken); } protected void FillDataFilterInfo() => ChangeTracker .Entries() .Where(w => w.Entity is IDataFilter && w.State == EntityState.Added) .ToList() .ForEach(entry => ((IDataFilter)entry.Entity).UserName = CurrentUserName); private string CurrentUserName => _httpContextAccessor.HttpContext.User?.Identity?.Name; }
八、验证结果,运行项目,首先注册一个账号。而后进行建立一本书。最终结果。
九、最后咱们来实现数据过滤部份代码,打开 ApplicatonDbContex.cs
添加私有方法DataFilters
private void DataFilters<T>(ModelBuilder builder) where T : class { builder.Entity<T>().HasQueryFilter(s => ((IDataFilter)s).UserName == CurrentUserName); }
添加一个静态MethodInfo方法。这里用到返射实现
private static readonly MethodInfo _dataFiltersMethodInfo = typeof(ApplicationDbContext).GetMethod(nameof(DataFilters), BindingFlags.Instance | BindingFlags.NonPublic);
在重写OnModelCreating ,针对全部实现 IDataFilter的实体添加数据过滤
protected override void OnModelCreating(ModelBuilder builder) { builder.Model .GetEntityTypes() .Where(w => typeof(IDataFilter).IsAssignableFrom(w.ClrType)) .ToList().ForEach(entityType => { _dataFiltersMethodInfo .MakeGenericMethod(entityType.ClrType) .Invoke(this, new object[] { builder }); }); base.OnModelCreating(builder); }
十、运行程序,分别用不一样的浏览器。注册两个账号。而后建立几本书。最终结果
完结!第一次写,见谅。
源码地址:https://github.com/CC1027CC/DataFilter
原文出处:https://www.cnblogs.com/cc1027cc/p/11098437.html