Razor Page Net Core 2.0 — сохранение данных после публикации

Я ломаю голову, пытаясь понять, что это должно быть просто...

Я хочу получить список всех пользователей, выбрать одного из них в ‹.select>, нажать кнопку, получить все роли, назначенные этому пользователю, и вот где он терпит неудачу, вот код

    public class RoleManagementModel : PageModel
    {
        private readonly RoleManager<ApplicationRole> _roleManager;
        private readonly UserManager<ApplicationUser> _userManager;

        public RoleManagementModel(RoleManager<ApplicationRole> roleManager,
                                    UserManager<ApplicationUser> userManager)
        {
            _roleManager = roleManager;
            _userManager = userManager;
        }

        [BindProperty]
        public InputModel Input { get; set; }

        public IList<ApplicationUser> UserList { get; set; }
        public IList<string> UserRoleList { get; set; } 
        public IList<string> RoleList { get; set; } 

        public class InputModel
        {
            public string User { get; set; }
            public string RoleToRemove { get; set; }
            public string RoleToAdd { get; set; }
        }

        public async Task<IActionResult> OnGetAsync()
        {
            UserList = _userManager.Users.ToList();
            UserRoleList = new List<string>();
            RoleList = new List<string>();
            return Page();
        }

        public async Task<IActionResult> OnPostGetRolesAsync()
        {
            var user = await _userManager.FindByNameAsync(Input.User);
            UserRoleList =  await _userManager.GetRolesAsync(user);
            return Page();
        }
    }

Это страница бритвы

        <select asp-for="Input.User" class="..">
            @foreach (ApplicationUser au in Model.UserList)
            {
                <option>@au.UserName</option>
            }
        </select>

    <button class=".." type="submit" asp-page-handler="GetRoles">Get Roles </button>

    <select asp-for="Input.RoleToRemove" class="..">
         @foreach (string ur in Model.UserRoleList)
         {
            <option>@ur</option>
         }
    </select>

Я пробовал следующее:

вернуть Page() после того, как OnPostGetRolesAsync() выдаст исключение

NullReferenceException: ссылка на объект не указывает на экземпляр объекта.

@foreach (ApplicationUser au in Model.UserList)

Я думаю, потому что OnGet не запускается, а UserList - это null

Если я изменю его на RedirectToPage(), тогда OnGet будет уволен и установит UserRoleList в новый список, и мы вернемся к исходной точке.

Удаление UserRoleList = new List<string>(); из OnGet вызовет такое же исключение (но для UserRoleList) при попытке открыть страницу.

ваше здоровье


person Unfrieden    schedule 18.12.2017    source источник
comment
использовать tempdata - лучший вариант, я думаю   -  person Arijit Mukherjee    schedule 19.12.2017


Ответы (1)


Вы загружаете UserList в Get, но вам нужно загрузить его снова для почтового запроса.

    public async Task<IActionResult> OnGetAsync()
    {
        UserList = _userManager.Users.ToList();
        UserRoleList = new List<string>();
        RoleList = new List<string>();
        return Page();
    }

    public async Task<IActionResult> OnPostGetRolesAsync()
    {
        UserList = _userManager.Users.ToList();     // You have to reload

        var user = await _userManager.FindByNameAsync(Input.User);
        UserRoleList =  await _userManager.GetRolesAsync(user);
        return Page();
    }
person pitaridis    schedule 19.12.2017
comment
Работает как шарм, я объединил его с TempData, чтобы уменьшить количество запросов к БД. Ваше здоровье! - person Unfrieden; 19.12.2017