首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET 5.0 -如何根据数据库值过滤索引/创建页面?

.NET 5.0 -如何根据数据库值过滤索引/创建页面?
EN

Stack Overflow用户
提问于 2021-03-22 23:16:11
回答 1查看 70关注 0票数 0

我正在使用.NET 5.0上的EF核心开发一个ASP.NET核心MVC应用程序。我已经根据这个文档配置了我的应用程序的Startup.CS文件来实现Azure AD身份验证:

https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-v2-aspnet-core-webapp

在我的Shared/_Layout.cshtml文件中,我可以使用以下命令访问/显示我的用户的电子邮件地址:

代码语言:javascript
复制
<span>Signed in as: @User.Identity.Name</span>

我的SQL Server数据库中有一个名为"Users“的表,它将一个OrganizationID与每个用户的电子邮件地址相关联。对于组织1、2和3,可能的值为1、2和3,然后值99是管理员,该管理员应该有权访问组织1、2和3中的所有内容。为了获得视觉效果,"Users“表/模型如下所示:

代码语言:javascript
复制
+--------+-----------------+----------------+
| UserID | EmailAddress    | OrganizationID |
+--------+-----------------+----------------+
| 1      | User1@email.com | 1              |
+--------+-----------------+----------------+
| 2      | User2@email.com | 2              |
+--------+-----------------+----------------+
| 3      | User3@email.com | 3              |
+--------+-----------------+----------------+
| 4      | Admin@email.com | 99             |
+--------+-----------------+----------------+

我有另一个表/模型,其中包含与OrganizationID相关的记录,我们称其为“课程”:

代码语言:javascript
复制
+----------+------------+----------------+
| CourseID | CourseName | OrganizationID |
+----------+------------+----------------+
| 1        | Math       | 1              |
+----------+------------+----------------+
| 2        | Science    | 1              |
+----------+------------+----------------+
| 3        | Art        | 2              |
+----------+------------+----------------+
| 4        | Literature | 3              |
+----------+------------+----------------+

当我为“课程”搭建CRUD页面时-当用户进入索引页面时,我只想让他们看到他们自己的OrganizationID课程。如果他们是管理员,我想让他们看到所有课程。

当用户转到“课程”创建页面时,我希望组织的下拉列表默认为他们自己的OrganizationID (并且不可更改),除非他们是管理员,在这种情况下,我希望他们能够手动选择OrganizationID。

我认为这是在每个页面/操作的控制器中处理的。但是我不知道如何根据用户的电子邮件地址访问OrganizationID,我也不知道如何修改我的控制器来做到这一点。在搭建CRUD页面之后,“课程”索引页面的控制器如下所示:

代码语言:javascript
复制
public async Task<IActionResult> Index()
        {
            var context_variable = _context.FormPage.Include(n => n.OrganizationNavigation);
            return View(await context_variable.ToListAsync());
        }

这是我修改索引以过滤某些记录的地方吗?Create页面怎么样?

EN

回答 1

Stack Overflow用户

发布于 2021-03-23 04:02:49

简而言之:可以,您可以在您的控制器操作方法中进行过滤。

更长的答案:在你的控制器中,你可以创建一个IEnumerable<Record>,它可以被发送到你的视图中,并在dropdown HTML对象中使用。就像这样

模型

创建一个具有IEnumerable<Record>属性的模型。将其作为对象的一部分传递给视图。例如,您可以创建一个ViewModel类:

代码语言:javascript
复制
public class UserRecordsViewModel
{
  public IdentityUser AppUSer {get; set;}
  public IEnumerable<Record> Records {get; set;}
}

如果不想为ViewModel创建单独的类,可以只扩展AppUser模型,使其具有Records属性。

控制器

在控制器中填充此ViewModel属性:

代码语言:javascript
复制
    var viewModel = new UserRecordsViewModel();
    viewModel.AppUser = user;
    // if admin, return all records
    if(user.OrganizationID == 99
    {
      IEnumerable<Record> viewModel.Records = repository.Records();
    }
    // if not admin, return just the records for their org
    else
    {
      IEnumerable<Record> viewModel.Records = repository.Records.Where(r => r.OrgranizationID == 
      user.OrganizationID)
    }

视图

然后在您的视图中,使用IEnumerable<Record> Records属性生成一个下拉列表。注意:这假设您的Record对象具有Name属性:

代码语言:javascript
复制
<div class="form-group">
  <select asp-for="Record" class="form-control">
    @foreach (var record in Model.Records)
    {
      <option value="@Name">
        @Name
      </option>
    }
  </select>
</div>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66748895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档