1、创建ASP.NET Core Web Applicatoin (MVC)项目,并且使用 Individual User Account

2、创建数据筛选接口 Models->IDataFilter.cs

    public interface IDataFilter
{
string UserName { get; set; }
}

3、创建实体 Models->Book.cs 并继承 IDataFilter接口,并将实体加入到 Data->ApplicatoinDbContext.cs 上下文中.

    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)
{
}
}

4、利用模板创建Book类的 CRUD界面。在 Controllers文件夹上 右键 选择 Add(新增)->Controller(控制器)

  

5、自动生成Book的增删改查之后,我们在这里要做一个细微的修改,因为我们IDataFilter字段 UserName是系统生成的,所以我们要修改两个地方

  将BooksController.cs 下的 Create Action(由于只做演示,没有去修改Update页面)里面的 Bind UserName去掉。修改后结果如下

  并将创建页面 Views->Books->Create.cshtml 中的 UserName 部份备注

  

  在母版页添加Book菜单链接 Views->Shared->_Layout.cshtml

6、打开Nuget管理控制台 迁移数据库,并F5运行,点击Book链接。检查一下程序 有没问题。

Add-Migration Init //创建迁移文件
Update-Database //更新到数据库

7、由于Book实体实现了IDataFilter,UserName我们会通过重写ApplicationDbContext的SaveChanges的实现,进行自动填充用户名.由于要获取登录信息,在ApplicationDbContext中我们需注入 IHttpContextAccessor

    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;
}

8、验证结果,运行项目,首先注册一个帐号。然后进行创建一本书。最终结果。

9、最后我们来实现数据过滤部份代码,打开 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);
}

10、运行程序,分别用不同的浏览器。注册两个帐号。然后创建几本书。最终结果

完结!第一次写,见谅。

源码地址:https://github.com/CC1027CC/DataFilter

最新文章

  1. 简介python2.x的编码
  2. iOS 全局禁止横屏,但UIWebView 全屏播放视频,横屏,解决办法(任意页面横竖屏或禁止)
  3. Spring学习笔记 Part.01
  4. java 集合(Set2)
  5. color 颜色代码 android res/values/colors.xml
  6. OpenJudge/Poj 1723 SOLDIERS
  7. [转]:移动端H5页面高清多屏适配方案
  8. Eclipse关闭XML文件验证的方法,解决xml警告
  9. mysql5.6 zip版安装
  10. 《浪潮之巅》完全系类——IT人士必读经典
  11. Linux Tomcat 自启动
  12. java 文件操作 写入和读取(小结一)
  13. 微信小程序简述
  14. css3-transition过渡属性
  15. LeetCode 501. Find Mode in Binary Search Tree (找到二叉搜索树的众数)
  16. redux中间件的原理
  17. 安装Feflow遇取的问题
  18. MySQL中KEY、PRIMARY KEY、UNIQUE KEY、INDEX 的区别
  19. Python之路【第八篇】:面向对象的程序设计
  20. 启动tomcat时报错:java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException:A child container failed during start

热门文章

  1. Spring boot配置说明
  2. C#并发集合
  3. SCJP考试题310-025(第二套&lt;4&gt;)92-147/147
  4. C# WPF 左侧菜单右侧内容布局效果实现
  5. 三:Java之Applet
  6. PowerDesigner模型分类
  7. C# TSF 输入法的获取
  8. 好玩的WPF第一弹:窗口抖动+边框阴影效果+倒计时显示文字
  9. React学习(3)——ref,key,PureComponent,bindActionCreator
  10. WCF配置文件详解