Как сохранить изменения на SQL сервере? - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь добавить контроллер для ApplicationUser.cs, чтобы при входе администратора они могли просматривать, редактировать, удалять любые записи из таблицы dbo.AspNetUsers, однако, думаю, я делаю это неправильно. Этот запуск с ошибкой «NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.» Любая идея?

AdminController:

public AdminController (ApplicationDbContext application)
{
    _application = application;

        [HttpGet]
        public IActionResult ActiveUser() { return View();}


        [HttpPost]
        public async Task<ActionResult> ActiveUser(ApplicationUser Model)
        {
            var active = await _application.Users.FindAsync(Model.Email);

            Model.IsActive = true;
            active.IsActive = (Model.IsActive==true);

         await _application.SaveChangesAsync(); 

            return View();
        }

Представление: `@model ApplicationUser

            <input asp-for="IsActive" class="form-control" />
            <span asp-validation-for="IsActive" class="text-danger"></span>
        </div>
        <button type="submit" class="btn btn-success">ok</button>`

Ответы [ 4 ]

2 голосов
/ 28 апреля 2020

Сообщение об ошибке указывает на то, что вы пытаетесь получить доступ к свойствам из нулевой ссылки. На основе предоставленного кода возможны две причины:

  1. "await _application.Users.FindAsyn c (Model.Email);" не находит пользователя и возвращает ноль, следовательно, когда вы пытаетесь сделать "active.IsActive = (Model.IsActive == true);" вы получаете исключение.

  2. Переменная «Модель» не получает экземпляр, и вы получаете исключение нулевой ссылки. Вам необходимо убедиться, что вы отправляете полезную нагрузку в «POST», а также украсить параметр «Model» атрибутом «[FromBody]». Смотрите ниже:

[HttpPost]
public async Task<ActionResult> ActiveUser([FromBody]ApplicationUser Model)
{
  // Always check the parameters....
  if (Model == null)
  {
     return View();
  }

  var active = await _application.Users.FindAsync(Model.Email);

  // Always verify if found...
  if (active == null)
  {
    Response.StatusCode=404;
    return View(); 
  }

  active.IsActive = (Model.IsActive==true);

  await _application.SaveChangesAsync(); 

  return View();
}
2 голосов
/ 27 апреля 2020

Вы фактически никогда не устанавливаете IsActive для объекта пользователя. Обратите внимание, что между '=' и '==' есть разница.

Попробуйте этот код:

 ApplicationUser active = await _application.Users.FindAsync(Model.Email);
 active.IsActive = true;
 _application.Update(active);
 await _application.SaveChangesAsync();
1 голос
/ 28 апреля 2020

Ваш код кажется правильным. Но, похоже, вам нужно передать model объект View. В вашем случае кажется, что вашему View потребуется объект active для передачи.

Попробуйте return View(active); вместо return View().

1 голос
/ 27 апреля 2020

Вам необходимо присвоить значение для Model.IsActive:

if (active.IsActive == false) 
{ 
    Model.IsActive = (active.IsActive == true); 
}
_application.Update(active);
await _application.SaveChangesAsync(); 
return View();
...