Мне очень плохо и немного глупо задавать этот вопрос, так как многим экспертам он может показаться простым, но это заставило меня работать бесконечно в течение нескольких дней без правильной работы моего решения, что немного расстраивает. Любая помощь, чтобы вытащить меня из этого прошлого, будет высоко оценена. Ссылка на код находится в конце этого поста. Все, что мне нужно, - это использовать способ авторизации в приложении Blazor CRUD, чтобы вошедшие в систему пользователи могли просматривать только данные, указанные для них c (созданные ими после входа в систему).
Что такое проект ? Я создал список напоминаний о назначениях (для учащихся), в котором дочерний компонент «AssignmentDetail» вложен в родительский объект с именем «AssignmentReminderList». Дочерний компонент: имеет форму для включения входных данных (как модальную) и показывает список назначений:
Важные части кода родительского компонента:
@if (assignmentList == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Assignments</th>
<th>Status</th>
<th>Due Date</th>
<th>Edit</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
@foreach (var assignment in assignmentList)
{
<tr>
<td>@assignment.Title</td>
<td>@assignment.Status</td>
<td>@assignment.DueDate</td>
<td><input type="button" class="btn btn-primary" @onclick="(()=>PrepareForEdit(assignment))" data-toggle="modal" data-target="#assignmentModal" value="Edit" /></td>
<td><input type="button" class="btn btn-primary" @onclick="(()=>PrepareForDelete(assignment))" data-toggle="modal" data-target="#confirmDeleteModal" value="Delete" /></td>
</tr>
}
</tbody>
</table>
}
<div>
<input type="button" data-toggle="modal" data-target="#assignmentModal" class="btn btn-primary" value="Add Task"
@onclick="(()=>InitializeAssignmentObject())" />
</div>
<ConfirmDelete OnClick="@Delete"></ConfirmDelete>
<AssignmentDetail AssignmentObject="assignmentObject" OnSave="@Refreshed">
<CustomHeader>@customHeader</CustomHeader>
</AssignmentDetail>
@code {
List<AssignmentReminder> assignmentList;
AssignmentReminder assignmentObject = new AssignmentReminder();
string customHeader = string.Empty;
private readonly ApplicationDbContext _db;
protected override async Task OnInitializedAsync()
{
assignmentList = await service.GetAssignments();
await GetUserDetails();
}
string Message = "";
public List<AssignmentReminder> AssignmentReminders { get; set; }
private async Task GetUserDetails()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
//if (user.Identity.IsAuthenticated)
//{
var currentUser = await UserManager.GetUserAsync(user);
var currentUserId = currentUser.Id;
assignmentList = await _db.assignments.Where(a => a.OwnerID == currentUserId).ToListAsync();
}
}
Модель:
public class AssignmentReminder
{
[Key]
public int Id { get; set; }
//User ID from AspNetUser table
public string OwnerID { get; set; }
[Required(ErrorMessage = "Assignment title is required")]
[StringLength(50, ErrorMessage = "Title is too long.")]
public string Title { get; set; }
[Required(ErrorMessage = "Status is required")]
public string Status { get; set; }
[Required(ErrorMessage = "Due Date is required")]
public DateTime DueDate { get; set; }
}
Теперь проблема в том, что метод GetUserDetails (), который я создал для фильтрации и получения данных, указанных c для пользователя, заканчивается во время выполнения Null Reference Exception, так как я не могу найти способ заполнить OwnerId (в Таблице назначений, которая совпадает с userId из таблицы AspNetUser), когда запись создается в таблице назначений.
Проект доступен по адресу: https://github.com/krchome/BlazorAssignmentReminder (для всех, кто хочет попробовать его в конце)