Как скрыть результат Json в строку в веб-сборке Blazor?

#http-get #blazor-webassembly #webapi #jsonserializer

Вопрос:

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

Контроллер HttpGet

 [HttpGet]
[Route("UserId")]
public async Task<ActionResult<ApplicationUser>> GetUserId(string Username)
{
  var user = await userManager.FindByNameAsync(Username);
  if (user == null)
  return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "Error", Message = "User not exist" });
  var result = await userManager.GetUserIdAsync(user);
  return new JsonResult(result);
}
 

Результат возврата контроллера

«85e39a3e-8101-4166-9193-5e41bec1a7ce»

Функция

 private async Task Login()
    {
        var user = new userName { Username = Username };
        var loginUser = new LoginDb { Username = Username, Password = Password };
        if (Username == null || Password == null)
        {
            toastService.ShowWarning("Please enter Username and Password");
        }
        else
        {
            user = await Http.GetFromJsonAsync<userName>("Authentication/UserId?Username="   Username);
            if (user != null)
            {
                string Id = System.Text.Json.JsonSerializer.Serialize(user);
                var result = await Http.PostAsJsonAsync("Authentication/login", loginUser);
                if (result.IsSuccessStatusCode)
                {
                    NavigationManager.NavigateTo("/profile/"   Id);
                    toastService.ShowSuccess("Login successful");
                }
                else
                {
                    toastService.ShowError("Username or Password is wrong");
                }
            }
            else
            {
                NavigationManager.NavigateTo("/login");
            }

        }
    }
 

Ответ №1:

Хорошо, я вижу несколько проблем.

На сервере:

 [HttpGet]
[Route("UserId")]
public async Task<ActionResult<ApplicationUser>> GetUserId(string Username)   // A
{
  var user = await userManager.FindByNameAsync(Username);
  if (user == null) // B
  return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "Error", Message = "User not exist" });
  var result = await userManager.GetUserIdAsync(user);
  return new JsonResult(result);
}
 

Во-первых, ваш тип возврата здесь таков Task<ActionResult<ApplicationUser>> . Пользователь приложения привязан к внутренней библиотеке идентификаторов, вы не можете и не должны использовать его для DTO.

И вы этого не делаете, в конце концов, у вас есть return new JsonResult(result); , что нормально, когда вы меняете тип возврата на просто Task<ActionResult> .

На клиенте:

 //user = await Http.GetFromJsonAsync<userName>("Authentication/UserId?Username="   Username);
  var userId = await Http.GetFromJsonAsync<string>("Authentication/UserId?Username="   Username);
 

Конечная точка возвращает простую строку. Json не знает об «имени пользователя» или о чем-либо еще.

 //string Id = System.Text.Json.JsonSerializer.Serialize(user); -- use UserId
 

Вы сериализуете идентификатор (снова) здесь, делая его почти наверняка недействительным для URL-адреса. Так что просто пропустите это.

Комментарии:

1. Спасибо, сэр, за ваш ответ и информацию, Спасибо. Отмечено!