#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. Спасибо, сэр, за ваш ответ и информацию, Спасибо. Отмечено!