Асинхронный вызов метода Fetch - ссылка на объект не установлена ​​на экземпляр объекта - PullRequest
0 голосов
/ 14 июня 2019

я пытаюсь настроить Fetch API, который должен вызывать метод на стороне сервера.

Javascript

fetch("/Admin/Server/ac0a45b9-3183-45c9-b4fc-65e37679f1110?handler=StartServer", {
  method: "get",
  headers: {"Content-Type": "application/json"},
  credentials: 'include'
}).then(response => {
  if (!response.ok) {
    throw response;
  }
  return response.json();
}).then(() => {
  console.log("Done");
});

Класс сервера

private readonly ServerManager ServerManager;

[BindProperty]
public Data.Server.Server Server { get; set; }

public ServerViewModel(ServerContext context, UserContext userContext) {
  this.ServerManager = new ServerManager(context, userContext);
}

public async Task<IActionResult> OnGetAsync(string serverId) {
  if (string.IsNullOrEmpty(serverId)) {
    return NotFound();
  }
  this.Server = await ServerManager.GetServerAsync(serverId);
  return Page();
}

public async Task<JsonResult> OnGetStartServer() {
  // all objects here are null
  return await this.ServerManager.StartServer(this.Server.serverId); // throw npe
}

Метод javascriptвызовите метод OnGetStartServer и выдайте эту ошибку: «Ссылка на объект не установлена ​​для экземпляра объекта»

Все объекты имеют значение null - как я могу решить это без повторной инициализации?

С уважением Тимо

1 Ответ

0 голосов
/ 14 июня 2019

Модель страницы создается и удаляется с каждым запросом.Поэтому все, что установлено для свойства, поля и т. Д., Исчезает в конце запроса.Независимо от того, какой код инициализирует член, он должен быть запущен для каждого обработчика, который должен его использовать, просто и просто.

Если вам нужно сохранить что-то вроде serverId, которое использовалось для его создания ранее, тогда вы можете использоватьSession для этого, а затем извлеките его из Session при следующем запросе, чтобы повторно инициализировать Server участника.Например:

public async Task<IActionResult> OnGetAsync(string serverId) {
  if (string.IsNullOrEmpty(serverId)) {
    return NotFound();
  }

  HttpContext.Session.SetString(ServerIdKey, serverId);
  return Page();
}

public async Task<JsonResult> OnGetStartServer() {
  var serverId = HttpContext.Session.GetString(ServerIdKey);
  if (serverId == null)
  {
      // Do something, like redirect to a page where the serverId can be set by the user or whatever
  }    

  return await this.ServerManager.StartServer(serverId);
}
...