Как сравнить значение между базой данных и клиентом .Net Core 2 - PullRequest
0 голосов
/ 26 декабря 2018

У нас есть эта страница редактирования 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();

1 Ответ

0 голосов
/ 27 декабря 2018

Поскольку у вас есть модель представления, я рекомендую вам упростить ваши привязки и позволить вашему коду для обработки других функций.Сначала вы можете создать свойство SelectedRoleId:

public int SelectedRoleId { get; set; }

В вашей модели представления вы можете присвоить этому свойству значение по умолчанию User.UserRoles.ElementAt(0).RoleId в конструкторе или в OnGet в зависимости от того, как вам нужноэто настроено.Таким образом, раскрывающийся список привязывается к простому свойству.

Для привязок к раскрывающимся спискам (выбор HTML) .NET Core предоставляет помощник по тегам asp-items.

<select asp-for="SelectedRoleId" asp-items="Model.RoleNameSL"></select>

В вашем OnPostAsync вы можете использовать SelectedRoleId для доступа к выбранному значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...