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



我正在使用 .NET 5.0 上的 EF Core 开发一个 ASP.NET Core MVC 应用程序。我已根据以下文档配置了应用程序的启动.CS文件以实现 Azure AD 身份验证:

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

在我的Shared/_Layout.cshtml文件中,我可以通过以下方式访问/显示用户的电子邮件地址:

<span>Signed in as: @User.Identity.Name</span>

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

+--------+-----------------+----------------+
| UserID | EmailAddress    | OrganizationID |
+--------+-----------------+----------------+
| 1      | User1@email.com | 1              |
+--------+-----------------+----------------+
| 2      | User2@email.com | 2              |
+--------+-----------------+----------------+
| 3      | User3@email.com | 3              |
+--------+-----------------+----------------+
| 4      | Admin@email.com | 99             |
+--------+-----------------+----------------+

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

+----------+------------+----------------+
| CourseID | CourseName | OrganizationID |
+----------+------------+----------------+
| 1        | Math       | 1              |
+----------+------------+----------------+
| 2        | Science    | 1              |
+----------+------------+----------------+
| 3        | Art        | 2              |
+----------+------------+----------------+
| 4        | Literature | 3              |
+----------+------------+----------------+

当我为"课程"搭建 CRUD 页面时 - 当用户转到索引页面时,我只希望他们看到自己的 OrganizationID 的课程。如果他们是管理员,我希望他们看到所有课程。

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

我认为这是在每个页面/操作的控制器中处理的?但是我不知道如何根据用户的电子邮件地址访问 OrganizationID,也不知道如何修改我的控制器来执行此操作。在基架 CRUD 页面之后,"课程"索引页面的控制器如下所示:

public async Task<IActionResult> Index()
{
var context_variable = _context.FormPage.Include(n => n.OrganizationNavigation);
return View(await context_variable.ToListAsync());
}

我是否在这里修改索引以筛选某些记录?"创建"页面怎么样?

简短回答:是的,您可以在控制器操作方法中进行筛选。

更长的答案:在您的控制器中,您可以创建一个可以发送到您的视图以在下拉 HTML 对象中使用的IEnumerable<Record>。类似的东西

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

public class UserRecordsViewModel
{
public IdentityUser AppUSer {get; set;}
public IEnumerable<Record> Records {get; set;}
}

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

控制器

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

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属性:

<div class="form-group">
<select asp-for="Record" class="form-control">
@foreach (var record in Model.Records)
{
<option value="@Name">
@Name
</option>
}
</select>
</div>

最新更新