У нас есть эта страница редактирования Razor (edit.cshtml), которая расширена от следующей модели страницы, и она очень проста, включает только PopulateRolesDropDownList:
public class RoleNamePageModel : PageModel
{
public SelectList RoleNameSL { get; set; }
public void PopulateRolesDropDownList(ApplicationDbContext _context,
object selectedRole = null)
{
var rolesQuery = from d in _context.Roles
orderby d.Name // Sort by name.
select d;
RoleNameSL = new SelectList(rolesQuery,
"RoleId", "Name", selectedRole);
}
}
Также на этой странице редактирования мы добавили:
<input type="hidden" asp-for="User.UserRoles.ElementAt(0).RoleId" name="User.Current.RoleId" />
Мы также делаем [BindProperty] в коде
public ApplicationUser User { get; set; }
Нам нужно выяснить, есть ли изменения в этой модели.Какой подход сделать это?
ОКРУЖАЮЩАЯ СРЕДА:
- .NET Core 2.2
- Razor Pages
ОБНОВЛЕНИЕ - 1:
В PostAsync мы сделали еще один вызов базы данных:
var userRoleToUpdate = await _context.UserRoles
.FirstOrDefaultAsync(m => m.UserId == id.ToString());
Нам просто нужно сравнить это значение с изменением навыпадающий список или нет.Мы не могли работать, как.
ОБНОВЛЕНИЕ - 2:
Мы изменили в соответствии с рекомендацией @NevilleNazerane ниже:
public class AssignClubUserViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string UserName { get; set; }
public Guid SelectedRoleID { get; set; }
}
[BindProperty]
public AssignClubUserViewModel AssignClubUser { get; set; }
и добавилиOnGetAsync:
public async Task<IActionResult> OnGetAsync(Guid? id)
{
if (id == null)
return NotFound();
var user = await _context.Users
.Include(u => u.ClubApplicationUsers)
.FirstOrDefaultAsync(m => m.Id == id.ToString());
AssignClubUser.FirstName = user.FirstName;
AssignClubUser.LastName = user.LastName;
AssignClubUser.UserName = user.UserName;
AssignClubUser.SelectedClubID =
user.ClubApplicationUsers.ElementAt(0).ClubID;
....
Это правильно?Я получил сообщение об ошибке: NullReferenceException: Arg_NullReferenceException в строке AssignClubUser.FirstName = user.FirstName;
UPDATE - 3:
Исправлено путем создания ModemView и затем при OnGetAsync() для запроса убедитесь, что сопоставлены с ModelView:
var user = await _context.Users
.Include(u => u.ClubApplicationUsers)
.Where(t => t.Id == id.ToString())
.Select(t => new AssignClubUserViewModel<ApplicationUser>
{
FirstName = t.FirstName,
LastName = t.LastName,
UserName = t.UserName,
SelectedClubID = t.ClubApplicationUsers.ElementAt(0).ClubID
}).SingleAsync();